使用双重提交 cookie 的角度 SPA 中的 CSRF 保护
Posted
技术标签:
【中文标题】使用双重提交 cookie 的角度 SPA 中的 CSRF 保护【英文标题】:CSRF protection in a angular SPA using Double Submit cookie 【发布时间】:2017-04-25 04:30:28 【问题描述】:我们正在努力尝试使用 AngularJS 和 Restful 服务在 SPA 中实现 CSRF 保护。
场景: 1. 创建用户登录 JWT,其中包含 CSRF 令牌作为有效负载的一部分。
JWT 被放入 HTTP Only Secure cookie 并在响应标头上发回
另外,相同的 CSRF Token 在响应中被发回。
javascript(角度)代码将 CSRF 令牌放入 $rootScope
任何用户/程序...发出受保护 api 的请求。在请求中从 $rootScope 发送 CSRF 令牌。
Cookie 与请求一起返回。
服务器查看 cookie 解包 JWT 中的 csrf 令牌,将 CSRF 令牌与请求正文中的令牌进行比较。
生成新的 CSRF 令牌...将其放入 jwt,将 jwt 放回 cookie 返回 cookie 以及响应中的 CSRF 令牌。 客户端收到响应,将 CSRF 令牌隐藏在 $rootScope 中。 重复问题:如果我在很短的时间内(亚秒级)有很多来自客户端(可能使用拦截器)的请求,该客户端从 $rootScope 获取 CSRF 令牌。我的请求中的 csrf 令牌是否与 Header/Cookie/JWT 中的 CSRF 令牌不同步?
附:我理解承诺等的概念。
底线是我希望对 API 的每个请求在正文中都有一个 CSRF 令牌,该令牌将与 Header/Cookie/JWT 中的 CSRF 令牌匹配。
【问题讨论】:
【参考方案1】:是的,根据我过去的经验,它有时会发生,导致难以捕捉错误。
您可以通过使用多个令牌并接受每个令牌等来解决此问题,以克服时间问题,但这将非常复杂,复杂性是安全性的敌人。
但是,您可以只为用户会话使用相同的 CSRF 令牌。如果令牌中有足够的熵(即足够长),攻击者仍然无法成功猜测它,因此您不必为每个请求生成一个新的。这解决了所有相关问题,同时非常简单且相当安全。 OWASP also states(中间某处)这已经足够了。
【讨论】:
以上是关于使用双重提交 cookie 的角度 SPA 中的 CSRF 保护的主要内容,如果未能解决你的问题,请参考以下文章