web-dev-qa-db-fra.com

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

Je suis Django 1.3 Web Development. 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.

Ceci est mon settings.py Inclus APPS. 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.views.login .. et je l’inclus dans

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/login.html ... copie collée à partir du livre. ça 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>

qu'est-ce que je rate?

33
Yousuf Jawwad

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

De cette manière, le modèle rendra un élément masqué avec la valeur définie pour le jeton CSRF. Lorsque le serveur Django recevra la demande de formulaire, Django vérifiera que le jeton correspond à la valeur rendue dans le formulaire. Cela est nécessaire pour garantir que les demandes POST (c'est-à-dire les demandes de modification de données) proviennent d'une session client authentique.

Pour plus d'informations, consultez la documentation de Django à l'adresse suivante: https://docs.djangoproject.com/en/dev/ref/csrf/

Voici un aperçu de l'attaque par falsification de requêtes inter-sites: https://www.owasp.org/index.php/CSRF

54
fcurella

Si vous utilisez la balise de modèle csrf_token mais ne changez rien, vérifiez le paramètre CSRF_COOKIE_DOMAIN. Vous devez définir None sur l'environnement de développement.

7
Mesut Tasci

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

 <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

Je voulais juste donner des informations supplémentaires sur le sujet. Si cela vous arrive et que vous êtes sûr que le jeton est injecté dans le formulaire et que les fonctions d'affichage gèrent tout correctement, le problème persiste. Assurez-vous qu'il n'y a pas de code javascript désactivant les champs de saisie. Ce qui m'est arrivé après deux heures de débogage, a finalement compris cela.

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

dans votre formulaire. Cela a fonctionné pour moi. Alors, pourquoi utilisons-nous le faux demandé par Cross-site?

Eh bien, la réponse est assez simple, elle vient d’ajouter une couche de sécurité à votre page Web, de sorte que tout utilisateur malveillant ne peut valider une demande en utilisant un mauvais jeton.

0
Patcho