2012-03-13 4 views
31

Я следую за Django 1.3 Веб-разработка. и для логинов я получаю следующую ошибку:Не удалось выполнить проверку CSRF. Запрос прерван. on django

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

Это мои настройки.py Включено APPS. Именно так в книге говорится, что это должно быть.

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

В книге говорится, она должна содержать, django.contrib.auth.views.login .. и я в том числе его в

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

и моей регистрации/login.html ... копия вставленный из книги. он должен это делать.

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

что мне не хватает?

ответ

52

В шаблоне Django необходимо добавить тег шаблона {% csrf_token %} в качестве дочернего элемента form.

Таким образом, шаблон отобразит скрытый элемент со значением, установленным на токен CSRF. Когда сервер Django получает запрос формы, Django проверяет, соответствует ли токен значению, которое было отображено в форме. Это необходимо для обеспечения того, чтобы запросы POST (т. Е. Запросы на изменение данных) исходили из аутентичного сеанса клиента.

Для получения дополнительной информации обратитесь к документации Django по адресу: https://docs.djangoproject.com/en/dev/ref/csrf/

Вот обзор Cross-Site Request Forgery атаки: https://www.owasp.org/index.php/CSRF

+0

спасибо, это помогает. – debuggerpk

+3

спасибо за ссылку –

7

Если вы используете csrf_token шаблонный тег, но ничего не изменится, проверка CSRF_COOKIE_DOMAIN установка. Вы должны установить для него None в среде разработки.

+2

Проверьте 'CSRF_COOKIE_SECURE', если ваш сервер-разработчик не имеет ssl. – Mark

4

Просто хотел предоставить дополнительную информацию по этой теме. Если это когда-либо случается с вами, и вы уверены, что токен вводится в форму, а функции представления обрабатывают все правильно, но проблема сохраняется. Убедитесь, что код javascript не отключен от полей ввода. Случилось со мной, после нескольких часов отладки, наконец, понял это.

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

Хорошая точка; значения элементов формы «disabled» не отправляются на сервер при отправке формы. –

5

У меня была та же проблема. Я решил эту проблему, когда добавил {% csrf_token%}. Наконец мой код это:

<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

Привет просто использовать {% csrf_token%} внутри ваших form.This работал для меня. Итак, почему мы используем поддельную подделку? Ну, ответ довольно прост, он просто добавил еще один уровень безопасности на вашу веб-страницу, в результате чего любой злонамеренный пользователь не может проверить запрос с использованием неправильного токена.

Смежные вопросы