Защита Django CSRF заставляет установить заголовок "Vary: Cookie", который приводит к неэффективному кешу
CjrfViewMiddleware от Django устанавливает заголовок "Vary: Cookie", это означает, что система кэширования будет учитывать не только URL страницы, но и файлы cookie пользователя, уникальные для каждого пользователя. Таким образом, страницы не кэшируются один раз для всех пользователей, но для каждого пользователя. И в моем случае у меня очень загруженный сайт, и такое поведение меня не удовлетворяет.
- У меня правильное мнение по этому вопросу, или я ошибаюсь?
- Можно ли отключить настройку заголовка "Vary: Cookie" без отключения защиты от CSRF?
2 ответа
Да, у вас есть правильное мнение по этому вопросу. При использовании CSRF-защиты Django для представления уникальны не только файлы cookie для каждого пользователя, но и содержимое страницы, поскольку каждая форма, защищенная CSRF, имеет скрытое поле csrftoken.
Вы можете обойти эту проблему, установив значение поля csrftoken, чтобы оно соответствовало cookie на стороне клиента с JavaScript, но Django не поставляет это из коробки.
Однако вам необходимо убедиться, что:
- ваши пользователи действительно получают уникальный токен CSRF как-то
- как отмечает @patrys, токены CSRF никогда не передаются случайно между пользователями через кеш (например, путем удаления заголовков Cookie из ответов)
Есть несколько возможностей выстрелить себе в ногу и сделать ваш сайт подверженным атакам CSRF.
Это поставит под угрозу безопасность вашего сайта, если несколько пользователей получат доступ к сайту через кеширующий прокси.
Прокси-сервер увидит, что ответ не зависит от файлов cookie, и будет предоставлять одинаковый ответ (вместе с одним и тем же токеном CSRF во вложенном скрытом поле и в заголовках файлов cookie) всем своим пользователям.
Поскольку все пользователи имеют один и тот же секрет, теперь они все открыты для атак подделки ресурсов между сайтами.
Кроме того, весьма вероятно, что каждое представление в конечном итоге будет кэшировано с использованием другого токена CSRF, и параллельный доступ к таким URL-адресам (на другой вкладке, в iframe или с использованием AJAX) перезапишет файлы cookie пользователя и, следовательно, сделает невозможным отправку запроса POST.,