Передайте токен Django CSRF в Angular с помощью CSRF_COOKIE_HTTPONLY
В Джанго, когда CSRF_COOKIE_HTTPONLY
если для этого параметра установлено значение True, файл cookie CSRF получает флаг httponly, что желательно с точки зрения безопасности, но нарушает стандартное угловое решение добавления этого файла cookie в httpProvider следующим образом:
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
В Django 1.9 был обходной путь, при котором вы могли просто передать cookie непосредственно в приложение, поместив его в шаблон:
<script>
window.csrf_token = "{{ csrf_token }}";
</script>
И положить это в угловое приложение:
angularApp.config(["$httpProvider", function($httpProvider)e {
$httpProvider.defaults.headers.common["X-CSRFToken"] = window.csrf_token;
}]
К сожалению, это не работает для одностраничных угловых приложений в Django 1.10+, поскольку файл cookie CSRF изменяется после каждого запроса. Как вы делаете почтовые запросы от Angular до Django 1.10+ с помощью CSRF_COOKIE_HTTPONLY
установка на?
NB. Отключение защиты CSRF не является приемлемым ответом.
2 ответа
У Django есть документированное решение для этого . Любой Javascript может получить токен CSRF из DOM, даже если CSRF_COOKIE_HTTPONLY включен, пока токен CSRF находится в DOM.
Шаг 1: я добавляю тег, чтобы промежуточное ПО Django помещало токен csrf в DOM.
Я думаю, что на этот вопрос хорошо ответили в этой дискуссии.
https://groups.google.com/forum/
https://code.djangoproject.com/ticket/27534
CSRF_COOKIE_HTTPONLY не обеспечивает никакой дополнительной безопасности для одностраничных приложений. Некоторые люди рекомендуют это решение
var csrftoken = getCookie('csrftoken');
if (csrftoken === null) {
csrftoken = $('input[name="csrfmiddlewaretoken"]').val();
if (csrftoken === null) {
console.log('No csrf token');
}
}
однако, либо если вы выставляете csrftoken для своего приложения с полным правом, ничто не мешает злому пользователю взять его и использовать его. Если вы запускаете одностраничное приложение, вы можете также установить CSRF_COOKIE_HTTPONLY=False, согласно комментарию ниже:
Гэвин Валь 5/4/15
Как так? Вы не можете просто ajax-получать вещи из разных доменов.
Я говорю об одном домене. Внедренный javascript на странице, которая не содержит токена CSRF, может получить другую страницу в том же домене, чтобы получить ее.
Если вы уже внедрили javascript на страницу жертв (XSS), нет необходимости извлекать токен CSRF, вы уже получили больший контроль.
Что ж, флаг HttpOnly предназначен для уменьшения ущерба, который может нанести злоумышленник после того, как уже может внедрить JavaScript. Но я согласен - сокрытие токена CSRF от javascript никак не повышает безопасность, но документация подразумевает, что это так. Я хочу прояснить в документации, что этот параметр не имеет никакого значимого эффекта.
Если вы все еще думаете, что у вас есть действующий вектор атаки, пожалуйста, отправьте его на secu...@djangoproject.com и добавьте немного больше объяснений.
Вектор атаки отсутствует. Это просто вводящая в заблуждение документация.