使用双重提交 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 保护的主要内容,如果未能解决你的问题,请参考以下文章

csrf 攻击和双重提交的 cookie

XSRF 和双重提交 cookie JWT 替代方案 - 这种实现安全吗?

如何防止flask-sqlalchemy中的双重数据提交

一段时间后,身份验证 cookie 在反应 SPA 中消失

需要cookie来记住双重身份验证成功(不是持久登录)

Laravel 5.6 - 用于自助API的Passport JWT httponly cookie SPA身份验证?