Django CSRF 保护强制设置“Vary: Cookie”标头,导致缓存效率低下

use*_*832 6 django cookies caching csrf-protection

Django 的 CsrfViewMiddleware 设置了“Vary: Cookie”标头,这意味着缓存系统不仅会考虑页面 URL,还会考虑每个用户唯一的用户 Cookie。因此页面不会为所有用户缓存一次,而是为每个用户缓存一次。就我而言,我的网站负载非常大,这种行为并不令我满意。

  • 我对这个问题的看法是正确的还是错误的?
  • 我可以在不关闭 CSRF 保护的情况下关闭设置“Vary: Cookie”标头吗?

Dan*_*per 4

是的,您在这个问题上的看法是正确的。当您对视图使用 Django 的 CSRF 保护时,不仅每个用户的 cookie 都是唯一的,而且页面内容也是唯一的,因为每个 CSRF 保护的表单都有一个隐藏字段 csrftoken。

您可以通过使用 JavaScript 设置 csrftoken 字段的值以匹配客户端的 cookie 来解决此问题,但这不是 Django 提供的开箱即用的功能。

但是,您必须确保:

  1. 您的用户实际上确实以某种方式获得了唯一的 CSRF 令牌
  2. 正如 @patrys 所指出的,CSRF 令牌永远不会通过缓存在用户之间意外共享(例如,通过从响应中剥离 Cookie 标头)

有很多机会会搬起石头砸自己的脚,让您的网站容易受到 CSRF 攻击。