wake-up-neo.com

Die CSRF-Überprüfung ist fehlgeschlagen. Anfrage abgebrochen. auf Django

Ich folge Django 1.3 Web Development. und für anmeldungen erhalte ich die folgende fehlermeldung

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

Dies ist meine settings.py Mitgelieferte APPS. Es ist genau so, wie das Buch sagt, dass es sein sollte.

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

Das Buch sagt, es sollte Django.contrib.auth.views.login .. enthalten, und ich füge es in ein

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

und meine registrierung/login.html ... kopie aus dem buch eingefügt. es sollte tun.

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

was vermisse ich?

33
Yousuf Jawwad

Sie müssen das Vorlagen-Tag {% csrf_token %} als untergeordnetes Element des Elements form in Ihrer Django-Vorlage hinzufügen.

Auf diese Weise rendert die Vorlage ein ausgeblendetes Element mit dem auf das CSRF-Token gesetzten Wert. Wenn der Django-Server die Formularanforderung erhält, überprüft Django, ob das Token mit dem Wert übereinstimmt, der im Formular dargestellt wurde. Dies ist notwendig, um sicherzustellen, dass POST -Anfragen (d. H. Datenänderungsanforderungen) von einer authentischen Clientsitzung stammen.

Weitere Informationen finden Sie in der Dokumentation zu Django unter: https://docs.djangoproject.com/en/dev/ref/csrf/

Hier finden Sie eine Übersicht über den Angriff für Cross-Site Request Forgery: https://www.owasp.org/index.php/CSRF

54
fcurella

Wenn Sie das Vorlagen-Tag csrf_token verwenden, aber nichts ändern, überprüfen Sie die Einstellung CSRF_COOKIE_DOMAIN. Sie sollten None in der Entwicklungsumgebung darauf setzen.

7
Mesut Tasci

Ich hatte das gleiche Problem. Ich habe dieses Problem gelöst, als ich {% csrf_token%} hinzugefügt habe. Schließlich lautet mein Code so:

 <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

Ich wollte nur zusätzliche Informationen zum Thema geben. Wenn es Ihnen jemals passiert und Sie sicher sind, dass das Token in das Formular eingefügt wird und die Ansichtsfunktionen alles ordnungsgemäß verarbeiten, das Problem jedoch weiterhin besteht. Stellen Sie sicher, dass kein JavaScript-Code vorhanden ist, der die Eingabefelder deaktiviert. Nach ein paar Stunden des Debugging fiel mir ein, dass mir das endlich klar wurde.

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

in deinem Formular. Das hat für mich geklappt. Warum verwenden wir die von Cross-Site angeforderte Fälschung?

Nun, die Antwort ist ziemlich einfach: Sie hat Ihrer Webseite lediglich eine weitere Sicherheitsschicht hinzugefügt, wodurch böswillige Benutzer eine Anforderung nicht mit einem falschen Token überprüfen können.

0
Patcho