【问题标题】:Django CSRF protection forces to set "Vary: Cookie" header that leads to inefficient cacheDjango CSRF 保护强制设置“Vary: Cookie”标头,导致缓存效率低下
【发布时间】:2015-11-18 01:34:48
【问题描述】:

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

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

【问题讨论】:

  • 你可以关闭它,但它会产生可怕的后果:通过某个缓存服务器或代理连接的每个用户都将拥有与通过该服务器连接的其他用户相同的 CSRF 令牌。
  • 启用Vary: Cookie 基本上可以让任何站点绕过您的CSRF 保护,因为它们与受害者拥有相同的令牌。

标签: django caching cookies csrf-protection


【解决方案1】:

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

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

但是,您必须确保:

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

有几个机会让你自己开枪,让你的网站容易受到 CSRF 攻击。

【讨论】:

  • Django 使用每个响应重新设置 CSRF cookie,因此任何缓存的响应也可能包含 Set-Cookie 标头。
【解决方案2】:

如果多个用户通过缓存代理访问站点,则会危及您站点的安全性。

代理将看到响应不依赖于 cookie,并将向其所有用户提供相同的响应(以及包含的隐藏字段和 cookie 标头中的相同 CSRF 令牌)。

由于所有用户共享相同的秘密,他们现在都对彼此的跨站点资源伪造攻击开放。

此外,每个视图很可能最终会使用不同的 CSRF 令牌进行缓存,并且并行访问此类 URL(在不同的选项卡中、在 iframe 中或使用 AJAX)会覆盖用户的 cookie,因此无法提交POST 请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多