【问题标题】:CSRF Token in REST API with authentication具有身份验证的 REST API 中的 CSRF 令牌
【发布时间】:2020-07-28 18:47:57
【问题描述】:

我了解 CSRF Token 保护的目的。

但是,我认为这种保护是无用的,如果 REST API 需要在每个操作的标头中添加 身份验证令牌,我们应该删除它。 p>

这样,即使 Mallory 伪造了指向 Alice 的恶意 HTML 链接,也无法进行攻击。原因是:

Alice 将她的身份验证信息保存在 Mallory 不知道的标头密钥中。与 cookie 不同的是,Alice 的浏览器不会自动提交此身份验证令牌。

因此,在这种情况下,我想请你谈谈这个问题的观点:我们可以从这种 API 设计中删除 CSRF 令牌保护吗?

【问题讨论】:

    标签: rest authentication http-headers csrf restful-authentication


    【解决方案1】:

    是的,当使用承载方案身份验证时,您不需要 CSRF 保护,因为浏览器不会自动将 Authorization 标头添加到请求中。

    您确实需要对 cookie、基本、Windows、摘要和客户端证书身份验证方案进行 CSRF 保护,因为这些是由浏览器自动添加的。

    另请参阅 Dominick Baier 关于隐式与显式身份验证的文章:http://leastprivilege.com/2015/04/01/implicit-vs-explicit-authentication-in-browser-based-applications/

    【讨论】:

    • 但是在典型的网络应用程序中,您不会将令牌存储在 cookie 中,然后将其设置为每个请求的授权标头吗?否则用户的会话不会持续,如果他们关闭窗口,他们需要重新登录。
    【解决方案2】:

    理论上,您不需要您描述的 CSRF 保护。但我主要关心的一个问题是在哪里存储访问令牌。浏览器的本地存储不提供良好的安全性。因此,它通常存储在 cookie 中。于是,CSRF 漏洞又回来了。

    Jean-Christophe Baey 在他的 article 中描述了一种双 cookie 机制,以防止来自 CSRF 的访问令牌和被 XSS 窃取。

    总结那篇文章:访问令牌的有效负载存储在 JavaScript 可访问的 cookie 中。访问令牌的签名存储在 JavaScript 无法访问的 cookie 中。 客户端从 cookie 中读取有效负载,并将其在 Authentication-Header 中传递给服务器。服务器根据 HttpOnly cookie 中发送的签名验证令牌。

    因此,它的 CSRF 保存和攻击者无法通过 XSS 窃取整个令牌,因为没有 JS 访问签名。

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 1970-01-01
      • 2016-07-16
      • 2018-11-24
      • 2020-09-12
      • 1970-01-01
      • 2016-10-08
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多