2012-03-13 15 views
31

Obserwuję Django 1.3 Web Development. i dla logowania, otrzymuję następujący błąd: To jest mój settings.py Dołączony APPS. Dokładnie tak mówi książka.Weryfikacja CSRF nie powiodła się. Żądanie zostało przerwane. na django

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

Książka mówi, powinna ona zawierać, django.contrib.auth.views.login .. i jestem w tym to w

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

i mojej rejestracji/login.html ... kopią wklejony z książki. powinien zrobić.

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

czego mi brakuje?

Odpowiedz

52

Musisz dodać znacznik szablonu {% csrf_token %} jako element potomny elementu form w szablonie Django.

W ten sposób szablon wyrenderuje ukryty element z wartością ustawioną na tokenie CSRF. Gdy serwer Django otrzyma żądanie formularza, Django sprawdzi, czy token odpowiada wartości wyrenderowanej w formularzu. Jest to konieczne, aby zapewnić, że żądania POST (to jest żądania zmiany danych) pochodzą z autentycznej sesji klienta.

Aby uzyskać więcej informacji, sprawdź dokumentację Django pod adresem: https://docs.djangoproject.com/en/dev/ref/csrf/

Oto przegląd Cross-Site ataku Zapytanie Fałszerstwo: https://www.owasp.org/index.php/CSRF

+0

dzięki, to pomaga. – debuggerpk

+3

dziękuję za link –

7

Jeśli używasz csrf_token szablon tag ale nic nie zmieni, sprawdź ustawienie CSRF_COOKIE_DOMAIN. Powinieneś ustawić None na to w środowisku programistycznym.

+2

Sprawdź również "CSRF_COOKIE_SECURE", jeśli twój serwer dev nie ma ssl. – Mark

4

Chciałbym podać dodatkowe informacje na ten temat. Jeśli zdarzy Ci się to kiedyś i masz pewność, że token jest wstrzykiwany w formie, a funkcje widoku obsługują wszystko poprawnie, ale problem nadal występuje. Upewnij się, że nie ma kodu javascript wyłączającego pola wejściowe. Zdarzyło mi się, po kilku godzinach debugowania, w końcu to zrozumiałem.

<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled=""> 
+0

Dobra rada; wartości elementów formularza "wyłączone" nie są wysyłane do serwera po przesłaniu formularza. –

5

Miałem ten sam problem. Rozwiązałem ten problem, dodając {% csrf_token%}. Wreszcie mój kod jest następujący:

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

Witam po prostu użyj {% csrf_token%} w formularzu. To mi się udało. Dlaczego używamy poproszenia o fałszerstwo? Cóż, odpowiedź jest dość prosta, po prostu dodała kolejną warstwę zabezpieczeń do strony internetowej, przy czym każdy złośliwy użytkownik nie może zweryfikować żądania za pomocą niewłaściwego tokena.

Powiązane problemy