it-swarm-pt.tech

Falha na verificação do CSRF. Pedido anulado. no django

Estou seguindo o Django 1.3 Web Development. e para logins, estou recebendo o seguinte erro

Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
    CSRF token missing or incorrect.

Este é meu settings.py APPS incluídos. É exatamente como o livro diz que deveria ser.

INSTALLED_APPS = (
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.sites',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'Django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'Django.contrib.admindocs',
    'djangocricket.Cricket',
    'djangocricket.cms'
)

O livro diz, ele deve conter, Django.contrib.auth.views.login .. e eu estou incluindo em

urlpatterns = patterns('',
    # Examples:
    url(r'^$', 'djangocricket.Cricket.views.index', name='default'),
    url(r'^user/(\w+)/$', 'djangocricket.Cricket.views.user_home', name='user home'),
    url(r'^login/$', 'Django.contrib.auth.views.login'),
    # url(r'^djangocricket/', include('djangocricket.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    #url(r'^admin/doc/', include('Django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    url(r'^news/', 'djangocricket.cms.views.index', name='index'),
    #url(r'^news/(?P<slug>[^\.]+).html', 'djangocricket.cms.views.detail', name='get_single_news_item'),
    url(r'^admin/', include(admin.site.urls)),
)

e meu registro/login.html ... cópia colada do livro. deveria fazer.

<html>
<head>
    <title>Django Bookmarks - User Login</title>
</head>
<h1>User Login</h1>
{% if form.errors %}
    <p>Your username and password didn't match.
        Please try again.</p>
{% endif %}
<form method="post" action=".">
    <p><label for="id_username">Username:</label>
        {{ form.username }}</p>
    <p><label for="id_password">Password:</label>
        {{ form.password }}</p>
    <input type="hidden" name="next" value="/" />
    <input type="submit" value="login" />
</form>
</body>
</html>

o que estou perdendo?

33
Yousuf Jawwad

Você precisa adicionar a tag do template {% csrf_token %} como um filho do elemento form no seu template do Django.

Dessa forma, o modelo renderizará um elemento oculto com o valor definido para o token CSRF. Quando o servidor Django recebe a solicitação de formulário, o Django irá verificar se o token corresponde ao valor que foi renderizado no formulário. Isso é necessário para garantir que as solicitações POST (ou seja, solicitações de alteração de dados) sejam originadas de uma sessão de cliente autêntica.

Para mais informações, verifique a documentação do Django em: https://docs.djangoproject.com/en/dev/ref/csrf/

Aqui está uma visão geral do ataque Cross-Site Request Forgery: https://www.owasp.org/index.php/CSRF

54
fcurella

Se você usar a tag template csrf_token, mas não alterar nada, verifique a configuração CSRF_COOKIE_DOMAIN. Você deve definir None para ele no ambiente de desenvolvimento.

7
Mesut Tasci

Eu tive o mesmo problema. Eu resolvi este problema quando adicionei o {% csrf_token%}. Finalmente meu código é este:

 <form id='formulario2' method='post' action='>
      <h3>Enter:</h3>
      {% csrf_token %}


     <input id="id_mesaje" name="mesaje" type="email" placeholder="E-mail"/>
    <input type='submit' name="boton2" value='Suscribete' style="display:inline-block;background-color: #80e174; "/>
 </form>
6
Alejandro Gonzalez

Só queria dar informações adicionais sobre o assunto. Se isso acontecer com você e você tiver certeza de que o token é injetado no formulário e as funções de exibição estão manipulando tudo corretamente, mas o problema persiste. Certifique-se de que não haja código javascript desativando os campos de entrada. Aconteceu comigo, depois de algumas horas de depuração, finalmente percebi isso.

<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled="">
4
amertkara
{% csrf_token %}

dentro do seu formulário. Isso funcionou para mim. Então, por que usamos a falsificação solicitada entre sites?

Bem, a resposta é bem simples, apenas adicionou outra camada de segurança à sua página da web, onde qualquer usuário mal-intencionado não pode validar uma solicitação usando um token errado.

0
Patcho