Не удалось выполнить проверку CSRF. Запрос прерван. на django
Я следую за Django 1.3 Web Development. и для логинов я получаю следующую ошибку:
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>
что мне не хватает?
Ответы
Ответ 1
Вам нужно добавить тег шаблона {% csrf_token %}
в качестве дочернего элемента form
в вашем шаблоне Django.
Таким образом, шаблон отобразит скрытый элемент со значением, установленным на токен CSRF. Когда сервер Django получает запрос формы, Django проверяет, соответствует ли токен значению, которое было отображено в форме. Это необходимо для обеспечения того, чтобы запросы POST (т.е. Запросы на изменение данных) исходили из аутентичного сеанса клиента.
Для получения дополнительной информации проверьте документацию Django по адресу:
https://docs.djangoproject.com/en/dev/ref/csrf/
Ниже приведен обзор атаки на межсайтовый запрос:
https://www.owasp.org/index.php/CSRF
Ответ 2
Если вы используете тег шаблона csrf_token
, но ничего не меняете, установите флажок CSRF_COOKIE_DOMAIN
. Вы должны установить для него None
в среде разработки.
Ответ 3
У меня была та же проблема. Я решил эту проблему, когда добавил {% 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>
Ответ 4
Просто хотел дать дополнительную информацию по этой теме. Если это когда-либо случается с вами, и вы уверены, что токен вводится в форму, а функции представления обрабатывают все правильно, но проблема сохраняется. Убедитесь, что код javascript не отключен от полей ввода. Случилось со мной, после нескольких часов отладки, наконец, понял это.
<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled="">
Ответ 5
Привет, просто используйте {% csrf_token%} внутри вашей формы. Это сработало для меня. Итак, почему мы используем поддельную подделку?
Ну, ответ довольно прост, он просто добавил еще один уровень безопасности на вашу веб-страницу, в результате чего любой злонамеренный пользователь не может проверить запрос с использованием неправильного токена.