【问题标题】:Avoiding CSRF tokens避免 CSRF 令牌
【发布时间】:2014-03-15 18:06:16
【问题描述】:

我有一个场景,我已经有 CSRF 令牌,但我必须删除。在电子商务中,产品页面由 Varnish 缓存,因此如果用户直接登陆这里,他将没有会话 ID 来验证令牌。在此页面中,我有一个“添加到购物车”按钮,其中包含 CSRF 令牌,但当然它是用错误的令牌缓存的。

我的问题是:还有另一种方法可以在不依赖令牌隐藏的输入的情况下进行 CSRF 保护?放置按钮的页面必须被缓存,所以这种情况下的令牌不好。

谢谢。

【问题讨论】:

    标签: caching csrf varnish csrf-protection


    【解决方案1】:

    要使 CSRF 令牌生效,您需要能够在 cookie 机制之外提交它。您可以让您的页面对您的站点执行 AJAX POST 以检索 CSRF 令牌。

    例如https://www.example.com/GetCSRFToken

    回复:

    { "token": "abcdefg" }
    

    然后,您将能够使用您的表单提交此令牌。由于这是一个单独的请求,因此响应不会成为您缓存页面的一部分。此方法的唯一缺点是必须启用 JavaScript 才能检索令牌。不过,您可能可以处理这种情况,如果由于禁用 JavaScript 而在没有令牌的情况下发布表单,您可以在将实际商品添加到购物车之前添加确认步骤。确认页面将被设置为不被缓存,因此每个用户将始终获得其会话的令牌。

    【讨论】:

    • 这是否与没有任何 CSRF 令牌并依赖同源策略一样?由于您可以保护/getCSRFToken 的唯一方法是通过同源策略,否则可以通过简单地执行两个帖子而不是一个帖子来发起 CSRF 攻击(第一个帖子是获取 CSRF 令牌,第二个请求将是攻击请求),除非我遗漏了有关如何保护 /GetCSRFToken 的信息?
    • 你不能在 csrf 攻击中检索值,你只能发送它们。同源策略允许写入,而不是读取,因此为什么需要 CSRF 缓解来进行写入。写我的意思是 POST 请求或其他“非安全”方法。这能回答你的问题吗?
    • 还是我误解了你的问题?我猜这是你的反对票?
    • 令牌是在响应正文中检索的,而不是cookie,并存储在dom中。由于 sop,第 3 方域将无法在 dom 中检索和存储。
    • 我认为你是对的,我会对此投反对票。但仍对这种实施持谨慎态度。你认为对/SetCSRFTokenCooke 的请求会起作用吗?这样做我更有信心。
    【解决方案2】:

    在 OWASP CSRF 预防备忘单中描述了一种替代方法,标题为 "Double Submit Cookies"

    它与表单一起提交会话 ID,其中 javascript 读取此 cookie 值并将其作为隐藏的输入元素注入表单。为此,您的会话 cookie 不得标记为 HTTPOnly,这是一种不好的做法。因此,当您尝试在 CSRF 上添加一些会话 cookie 安全性时,您会失去一些会话 cookie 安全性。

    作为对这种方法的改进,您可以创建另一个存储 CSRF 令牌值的登录 cookie,并使用此 cookie 代替 sessionid cookie。现在您可以将 sessionid cookie 标记为HTTPOnly。 (不将 csrf cookie 标记为 httponly 也是一种不好的做法,但不像以前那样重要)

    (出于性能原因,我假设通过 AJAX 调用在每个页面上检索 csrf 令牌不是一种选择)

    【讨论】:

      【解决方案3】:

      您可以为 CSRF 使用 cookie,cookie 在表单页面上设置并在下一个页面上检查。它可能需要一些调整,但它会绕过缓存。

      不要忘记将 Varnish 配置为不删除该 cookie。

      【讨论】:

      • 您不想缓存带有 set-cookie 的页面,否则每个人都会得到相同的 cookie。
      猜你喜欢
      • 2018-01-02
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 2011-09-24
      • 2014-04-29
      • 2016-01-31
      相关资源
      最近更新 更多