Защита Django CSRF заставляет установить заголовок "Vary: Cookie", который приводит к неэффективному кешу

CjrfViewMiddleware от Django устанавливает заголовок "Vary: Cookie", это означает, что система кэширования будет учитывать не только URL страницы, но и файлы cookie пользователя, уникальные для каждого пользователя. Таким образом, страницы не кэшируются один раз для всех пользователей, но для каждого пользователя. И в моем случае у меня очень загруженный сайт, и такое поведение меня не удовлетворяет.

  • У меня правильное мнение по этому вопросу, или я ошибаюсь?
  • Можно ли отключить настройку заголовка "Vary: Cookie" без отключения защиты от CSRF?

2 ответа

Решение

Да, у вас есть правильное мнение по этому вопросу. При использовании CSRF-защиты Django для представления уникальны не только файлы cookie для каждого пользователя, но и содержимое страницы, поскольку каждая форма, защищенная CSRF, имеет скрытое поле csrftoken.

Вы можете обойти эту проблему, установив значение поля csrftoken, чтобы оно соответствовало cookie на стороне клиента с JavaScript, но Django не поставляет это из коробки.

Однако вам необходимо убедиться, что:

  1. ваши пользователи действительно получают уникальный токен CSRF как-то
  2. как отмечает @patrys, токены CSRF никогда не передаются случайно между пользователями через кеш (например, путем удаления заголовков Cookie из ответов)

Есть несколько возможностей выстрелить себе в ногу и сделать ваш сайт подверженным атакам CSRF.

Это поставит под угрозу безопасность вашего сайта, если несколько пользователей получат доступ к сайту через кеширующий прокси.

Прокси-сервер увидит, что ответ не зависит от файлов cookie, и будет предоставлять одинаковый ответ (вместе с одним и тем же токеном CSRF во вложенном скрытом поле и в заголовках файлов cookie) всем своим пользователям.

Поскольку все пользователи имеют один и тот же секрет, теперь они все открыты для атак подделки ресурсов между сайтами.

Кроме того, весьма вероятно, что каждое представление в конечном итоге будет кэшировано с использованием другого токена CSRF, и параллельный доступ к таким URL-адресам (на другой вкладке, в iframe или с использованием AJAX) перезапишет файлы cookie пользователя и, следовательно, сделает невозможным отправку запроса POST.,

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