Заголовок 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-атак.