La vérification du CSRF a échoué. Demande abandonnée. sur django

Je suis Django 1.3 Développement Web. et pour les connexions, j'obtiens l'erreur suivante

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

C'est mon settings.py applications incluses. C'est exactement ce que le livre dit qu'il devrait être.

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'
)

le livre dit, il devrait contenir, django.contrib.auth.vue.connexion. . et je suis notamment en

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)),
)

et mon inscription/connexion.HTML. .. copie-collé à partir du livre. il devrait faire.

<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>

ce qui me manque?

32
demandé sur Yousuf Jawwad 2012-03-14 01:42:34

5 réponses

Vous devez ajouter le {% csrf_token %} balise de modèle en tant qu'enfant de l' form élément dans votre modèle Django.

de cette façon, le modèle affichera un élément caché avec la valeur définie au jeton CSRF. Lorsque le serveur Django reçoit la demande de formulaire, Django vérifiera que le jeton correspond à la valeur qui a été rendue dans le formulaire. Cela est nécessaire pour s'assurer que les requêtes POST (c.-à-d. les requêtes de modification de données) proviennent d'une session client authentique.

Pour en savoir plus info, consultez la documentation de Django à: https://docs.djangoproject.com/en/dev/ref/csrf/

voici un aperçu de l'attaque contre la falsification de demandes sur plusieurs sites: https://www.owasp.org/index.php/CSRF

53
répondu fcurella 2016-03-14 23:15:50

Si vous utilisez csrf_token modèle de balise, mais pas changer quoi que ce soit, vérifiez CSRF_COOKIE_DOMAIN paramètre. Vous devez définir None sur l'environnement de développement.

7
répondu Mesut Tasci 2013-12-04 10:26:38

j'ai eu le même problème. J'ai résolu ce problème en ajoutant le {% csrf_token %}. Enfin, mon code est:

 <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
répondu Alejandro Gonzalez 2014-12-04 22:44:36

voulais Juste donner des infos supplémentaires sur le sujet. Si cela vous arrive et que vous êtes sûr que le token est injecté dans la forme et que les fonctions de vue gèrent tout correctement, le problème persiste. Assurez-vous qu'il n'y a pas de code javascript désactivant les champs d'entrée. Cela m'est arrivé, après quelques heures de débogage, finalement rendu compte que.

<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled="">
4
répondu amertkara 2014-11-14 16:18:05

Hi il suffit d'utiliser {% csrf_token%} dans votre formulaire.Cela a fonctionné pour moi. Alors pourquoi utilisons-nous la falsification demandée sur plusieurs sites ? Eh bien, la réponse est assez simple, il vient d'ajouter une autre couche de sécurité à votre page web, par laquelle tout utilisateur malveillant ne peut pas valider une demande en utilisant un mauvais token.

0
répondu Patcho 2017-06-20 06:24:52