REST API 中的 CSRF 令牌,带身份验证

CSRF Token in REST API with authentication

我了解 CSRF 令牌 保护的目的。

但是,我认为这种保护是无用的,我们应该在 REST API 需要 身份验证令牌的情况下将其删除 在每个操作的 header 中。

这样即使Mallory伪造了一个恶意的HTMLlink给Alice,也无法进行攻击。原因是:

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

所以在这种情况下,我想听听您对这个问题的看法:我们可以从这种 API 设计中删除 CSRF 令牌保护吗?

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

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

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

理论上,您不需要您描述的 CSRF 保护。但我主要关心的问题之一是在哪里存储访问令牌。浏览器的本地存储没有提供良好的安全性。所以它通常存储在 cookie 中。于是,CSRF漏洞卷土重来。

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

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

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