Заголовок Django 1.6 HTTP_X_CSRFTOKEN игнорируется, если отсутствует файл cookie csrf

У меня есть AJAX-код, который делает POST-запросы к приложению Django 1.6.4. В представлении включена защита CSRF через django.middleware.csrf.CsrfViewMiddleware, Если я не передаю файл cookie, но передаю HTTP_X_CSRFTOKEN, он завершается ошибкой.

Я смотрю на код django.middleware.csrf.CsrfViewMiddleware и я вижу, что в строке 161 он проверяет, если if csrf_token is None: после получения этого от печенья. Если это None, он возвращается. Только после этого он проверяет csrfmiddlewaretoken парам и HTTP_X_CSRFTOKEN заголовок запроса. Это выглядит неправильно, и проверка на отсутствие значения csrf_token должна выполняться только после проверки всех возможных мест, где его можно найти.

У кого-нибудь еще были подобные проблемы? Я вижу это неправильно?

2 ответа

Я думаю, что путаница может быть в том, что файл cookie CSRF и HTTP_X_CSRFTOKEN Заголовок HTTP существует на противоположных сторонах сравнения. Другими словами, чтобы предотвратить атаки CSRF, Джанго сравнивает:

Значение файла cookie CSRF и значение токена POST ("csrfmiddlewaretoken")

(или же)

Значение файла cookie CSRF и значение заголовка HTTP ("HTTP_X_CSRFTOKEN")

Вот почему печенье всегда необходимо. С использованием HTTP_X_CSRFTOKEN заголовок является заменой для установки токена в данных POST, а не заменяет cookie.

Если вы используете jQuery, вы можете создать функцию beforeSend, которая включает токен csrf. Джанго CSRF для получения дополнительной информации.

Пожалуйста, имейте в виду, что Django ищет заголовок X-CSRFToken не HTTP_X_CSRFTOKEN, По крайней мере, это была моя проблема во время отладки кода. (Я также проверил django.middleware.csrf.CsrfViewMiddleware за это)


if csrf_token is None это дополнительная проверка, выполненная Джанго. (Из комментария в условии if.

Нет файла CSRF. Для запросов POST мы настаиваем на использовании файла cookie CSRF, и таким образом мы можем избежать всех атак CSRF, включая вход в CSRF.

Я думаю (не уверен), что нет единой проверки, чтобы проверять только заголовок из ajax post-запроса, и Django будет делать проверки, чтобы предотвратить любую форму CSRF-атак.

Другие вопросы по тегам