我理解 CSRF令牌保护的目的。
但是,我认为这种保护毫无用处,我们应该在 REST API 的情况下将其删除,在每个操作的标头中都需要身份验证令牌。
这样,即使Mallory伪造到Alice的恶意HTML链接,攻击也无法完成。原因是:
Alice将她的身份验证信息保存在Mallory不知道的标题密钥中。与cookie不同,Alice的浏览器不会自动提交此身份验证令牌。
所以在这种情况下,我想让您对这个问题有一个观点:我们可以从这种API设计中删除CSRF令牌保护吗?
答案 0 :(得分:6)
是的,在使用承载方案身份验证时,您不需要CSRF保护,因为浏览器不会自动将Authorization标头添加到请求中。
您需要对Cookie,基本,Windows,摘要和客户端证书身份验证方案进行CSRF保护,因为这些会自动添加到浏览器中。
另见Dominick Baier关于隐式与显式身份验证的文章:http://leastprivilege.com/2015/04/01/implicit-vs-explicit-authentication-in-browser-based-applications/
答案 1 :(得分:0)
从理论上讲,您不需要如上所述的CSRF保护。但是我主要关心的问题之一是访问令牌的存储位置。浏览器的本地存储不能提供良好的安全性。因此,它通常存储在cookie中。因此,CSRF漏洞又回来了。
Jean-Christophe Baey在他的article中描述了一种双cookie机制,以防止来自CSRF的访问令牌和XSS盗窃。
总结一下:访问令牌的有效负载存储在cookie中,JavaScript可以访问该cookie。访问令牌的签名存储在JavaScript不能访问的Cookie中。 客户端从cookie中读取有效负载,并将其在Authentication-Header中传递给服务器。服务器根据HttpOnly cookie中发送的签名来验证令牌。
因此,其CSRF保存和攻击者无法通过XSS窃取整个令牌,因为没有JS访问签名。