如何使用客户端应用和 API 为每个请求实现反 csrf 令牌



我有一个客户端应用程序(用Angularjs编写)和一个客户端使用的API。该 api 使用会话 cookie 进行身份验证(不要问为什么,我无法更改它)。

我正在尝试实现每个请求的 csrf 令牌生成。通常,如果我有服务器端 html 渲染,我会为每个表单生成一个 csrf 令牌作为隐藏输入。

使用客户端Javascript应用程序执行此操作的最佳方法是什么?我想创建一个 api 端点,如果用户经过身份验证,它会生成一个 csrf 令牌,获取该令牌并通过 post 请求提交它。但我不确定这是否真的安全。有什么想法吗?

我知道每个请求或每个会话有很多关于 csrf 令牌的争论。我试图找出在不造成更多漏洞的情况下实施此特定机制的最佳方法是什么;这是每个请求的CSRF令牌,具有客户端API设置。

我有一个解决方案,我将回答我自己的问题。如果您有更好的解决方案,请发布您的答案,或者如果您认为这种方法有任何潜在的危险或缺陷,请发表评论。

因此,我认为我能做的是在 api 上创建一个响应过滤器,并为当前会话的每个响应发送一个新的 csrf 令牌作为自定义响应标头。

在客户端,我可以创建一个 http 响应拦截器来存储此 csrf 令牌,并创建一个请求拦截器来将此令牌添加为自定义 csrf 标头以发送回 api。

也可以在每个请求(SET-COOKIE 标头)上将其设置为 cookie,并让浏览器处理它(在 Angular 中,如果设置了 cookie XSRF-TOKEN,则$http服务将自动将其作为 X-XSRF-TOKEN http 标头发送)。但是,如果打开多个选项卡,这将导致无效的 csrf 问题。

最新更新