Django не будет устанавливать HttpOnly для файла cookie csrftoken

В моем Django settings.py у меня есть

SESSION_COOKIE_HTTPONLY = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = 'DENY'
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 15768000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SESSION_COOKIE_AGE = 2 * 24 * 3600

Однако https://detectify.com обнаружил, что этот флаг не установлен для файла cookie csrftoken. Я проверил, что Chrome говорит о файле cookie, и, если я правильно понимаю, пустой столбец HTTP подтверждает, что два файла cookie не являются только HTTP: введите здесь описание изображения

Кроме того, если я делаю document.cookie в консоли Chrome, отображается значение csrftoken.

Интересно, почему это может быть так? У меня Django работает на uwsgi и nginx. Конфигурация nginx выглядит следующим образом, а рассматриваемый сайт — https://rodichi.net:

server {
    listen 443 ssl http2 default_server;
    server_name rodichi.net;

    ssl_certificate /etc/letsencrypt/live/rodichi.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/rodichi.net/privkey.pem;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    charset     utf-8;

    ... # location settings follow here

```


person texnic    schedule 30.06.2017    source источник
comment
Съешьте (удалите) ваши куки. По крайней мере, идентификатор сеанса правильно установлен с HTTPonly. и вам не хватает CSRF_COOKIE_HTTPONLY.   -  person Melvyn    schedule 30.06.2017


Ответы (1)


Вы только настроили его так, чтобы для токена CSRF было установлено значение «Безопасный» (т.е. отправлялось только через HTTP-запросы), а не HttpOnly (т.е. недоступный для Javascript).

Глядя на документацию Django, вам также необходимо установить CSRF_COOKIE_HTTPONLY. Однако в документации справедливо указано:

Обозначение файла cookie CSRF как HttpOnly не обеспечивает никакой практической защиты, поскольку CSRF предназначен только для защиты от междоменных атак. Если злоумышленник может прочитать файл cookie через JavaScript, он уже находится в том же домене, насколько известно браузеру, поэтому он может делать все, что захочет. (XSS — гораздо большая дыра, чем CSRF.)

Хотя этот параметр дает мало практической пользы, он иногда требуется аудиторам безопасности.

Это также зависит от того, как вы реализовали CSRF. В основном есть два метода для форм:

  1. Установите скрытое поле CSRF для каждой формы и заставьте это поле генерировать уникальное значение каждый раз при загрузке формы. Поэтому, если отправка формы включает действительный код, вы знаете, что запрос пришел с вашего домена. Это сложно на стороне сервера, так как требует отслеживания действительных токенов, а также означает, что каждая форма должна динамически генерироваться, чтобы включать случайный токен, но проще на стороне клиента, поскольку используются стандартные запросы форм, а не JavaScript. Для этой защиты файл cookie CSRF не требуется и не используется, даже если он присутствует.

  2. Другой метод вызывает установку файла cookie CSRF, а Javascript читает его и отправляет в заголовке HTTP (обычно X-CSRF-TOKEN). Запрос CSRF из другого домена не будет иметь доступа к этому файлу cookie CSRF, поэтому не сможет правильно установить заголовок. Поскольку файлы cookie также будут отправляться по всем запросам, серверу легко проверить, соответствует ли файл cookie в HTTP-запросе заголовку, установленному в запросе. Это означает, что запрос пришел откуда-то, у кого есть доступ к файлам cookie, что означает, что он пришел из того же домена. Это означает, что это не CSRF-атака. Это проще реализовать на стороне сервера (поскольку нет необходимости вести список активных токенов), но для этого требуется Javascript во внешнем интерфейсе и требуется, чтобы токен CSRF не был HttpOnly — именно потому, что токен должен быть прочитан Javascript на стороне клиента!

Опять же, документация Django предупреждает об этом:

Если вы включите это и вам нужно отправить значение токена CSRF с запросом AJAX, ваш JavaScript должен получить значение из ввода скрытой формы токена CSRF на странице, а не из файла cookie.

Итак, в целом не рекомендуется устанавливать атрибут HttpOnly для этого файла cookie. Он ограничивает вас, не добавляет реальной защиты и делает сам файл cookie бессмысленным.

Вы увидите его в отчетах и ​​отчетах Pen Test на своем сайте (включая https://detectify.com, судя по всему). ), но должны принять это, как вам удобно, что это правильно. Не уверены, можно ли внести этот файл cookie в белый список на https://detectify.com, чтобы он не выдавал предупреждения каждый раз?

person Barry Pollard    schedule 01.07.2017