Проверка CSRF не удалась. Запрос отменен. на джанго - PullRequest
35 голосов
/ 14 марта 2012

Я слежу за веб-разработкой Django 1.3.а для логинов я получаю следующую ошибку

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

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

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>

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

Ответы [ 5 ]

59 голосов
/ 14 марта 2012

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

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

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

Вотобзор атаки подделки межсайтовых запросов: https://www.owasp.org/index.php/CSRF

9 голосов
/ 29 ноября 2013

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

7 голосов
/ 05 декабря 2014

У меня была такая же проблема. Я решил эту проблему, когда добавил {% 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 голосов
/ 14 ноября 2014

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

<input type="hidden" name="csrfmiddlewaretoken" value="pHK2CZzBB323BM2Nq7DE2sxnQoBG1jPl" disabled="">
0 голосов
/ 20 июня 2017
{% csrf_token %}

внутри вашей формы.Это сработало для меня.Итак, почему мы используем межсайтовый запрос подделки?

Что ж, ответ довольно прост: он просто добавил еще один уровень безопасности на вашу веб-страницу, в результате чего любой злонамеренный пользователь не может проверить запрос с использованием неправильного токена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...