Django CSRF 保护强制设置 "Vary: Cookie" header 导致缓存效率低下
Django CSRF protection forces to set "Vary: Cookie" header that leads to inefficient cache
Django 的 CsrfViewMiddleware 集 "Vary: Cookie" header,这意味着缓存系统不仅会考虑页面 URL,还会考虑每个用户唯一的用户 Cookie。
所以页面不会为所有用户缓存一次,而是为每个用户缓存一次。就我而言,我的网站负载非常大,这种行为并不令我满意。
- 我对这个问题的看法是对的还是错的?
- 我可以在不关闭 CSRF 保护的情况下关闭设置 "Vary: Cookie" header 吗?
如果多个用户通过缓存代理访问网站,将会危及您网站的安全。
代理将看到响应不依赖于 cookie,并将向其所有用户提供相同的响应(以及包含的隐藏字段和 cookie headers 中的相同 CSRF 令牌)。
由于所有用户共享同一个秘密,他们现在都可以互相开放 cross-site 资源伪造攻击。
此外,每个视图很可能最终会使用不同的 CSRF 令牌进行缓存,并且并行访问此类 URL(在不同的选项卡中、在 iframe 中或使用 AJAX)将覆盖用户的 cookie 和因此无法提交 POST 请求。
是的,你对这个问题的看法是对的。当您使用 Django 的 CSRF-protection 进行视图时,不仅每个用户的 cookie 都是唯一的,而且页面内容也是唯一的,因为每个 CSRF-protected 表单都有一个隐藏字段 csrftoken.
您可以通过设置 csrftoken 字段的值以将客户端的 cookie 与 JavaScript 匹配来解决此问题,但这不是 Django 开箱即用的。
但是,您必须确保:
- 您的用户确实以某种方式获得了唯一的 CSRF 令牌
- 如@patrys 所述,CSRF 令牌绝不会通过缓存在用户之间意外共享(例如,通过从响应中剥离 Cookie headers)
有很多机会搬起石头砸自己的脚,让您的网站容易受到 CSRF 攻击。
Django 的 CsrfViewMiddleware 集 "Vary: Cookie" header,这意味着缓存系统不仅会考虑页面 URL,还会考虑每个用户唯一的用户 Cookie。 所以页面不会为所有用户缓存一次,而是为每个用户缓存一次。就我而言,我的网站负载非常大,这种行为并不令我满意。
- 我对这个问题的看法是对的还是错的?
- 我可以在不关闭 CSRF 保护的情况下关闭设置 "Vary: Cookie" header 吗?
如果多个用户通过缓存代理访问网站,将会危及您网站的安全。
代理将看到响应不依赖于 cookie,并将向其所有用户提供相同的响应(以及包含的隐藏字段和 cookie headers 中的相同 CSRF 令牌)。
由于所有用户共享同一个秘密,他们现在都可以互相开放 cross-site 资源伪造攻击。
此外,每个视图很可能最终会使用不同的 CSRF 令牌进行缓存,并且并行访问此类 URL(在不同的选项卡中、在 iframe 中或使用 AJAX)将覆盖用户的 cookie 和因此无法提交 POST 请求。
是的,你对这个问题的看法是对的。当您使用 Django 的 CSRF-protection 进行视图时,不仅每个用户的 cookie 都是唯一的,而且页面内容也是唯一的,因为每个 CSRF-protected 表单都有一个隐藏字段 csrftoken.
您可以通过设置 csrftoken 字段的值以将客户端的 cookie 与 JavaScript 匹配来解决此问题,但这不是 Django 开箱即用的。
但是,您必须确保:
- 您的用户确实以某种方式获得了唯一的 CSRF 令牌
- 如@patrys 所述,CSRF 令牌绝不会通过缓存在用户之间意外共享(例如,通过从响应中剥离 Cookie headers)
有很多机会搬起石头砸自己的脚,让您的网站容易受到 CSRF 攻击。