Django CSRF 保护强制设置 "Vary: Cookie" header ,导致缓存效率低下

标签 django caching cookies csrf-protection

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

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

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

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

    但是,您必须确保:

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

  • 有几种机会可以让您自己动手并使您的网站容易受到 CSRF 攻击。

    关于Django CSRF 保护强制设置 "Vary: Cookie" header ,导致缓存效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31959084/

    相关文章:

    asp.net - 我的 ASP.NET 缓存存储在服务器还是浏览器上

    java - 编码java Cookie值

    javascript - firebase 云函数不会存储名为 "__session"以外的 cookie

    cookies - 无法在 HTTPoison 中设置两个或多个 cookie

    css - 如何覆盖 Django 中的 bootstrap cdn?

    python - 抽象类作为外键

    python - 如何将多个查询减少为一个查询?

    c# - dapper 缓存的 "information"到底是什么?

    javascript - 关于 django 模板中表单字段值的动态隐藏/取消隐藏选项卡

    c# - 将应用程序缓存与 session 数据相结合时的信任边界违规