从服务器到AngularJS客户端的CSRF令牌交换



我正疯狂地想办法为我的Web应用程序实现CSRF保护。我已经读了很多页了,但仍然无法在特定的背景下决定解决方案。

因此,首先我的Web应用程序是用Angular编写的,静态部署在Apache服务器上。它调用我的服务器上的一些服务,Java类型,部署在应用程序服务器上的战争中。它们都部署在同一个域上。身份验证后,在响应中设置通常的会话cookie(secure+HttpOnly)。

现在,我想实现一个基于同步器令牌或双提交cookie模式的CSRF保护(但从我看到的第一个是更好的解决方案,因为我可以在服务器端处理状态)。

我看到的大多数解决方案都建议生成令牌服务器端,并将其存储在cookie中,以便在客户端访问。这是一个很大的制约因素,因为Javascript无法访问cookie,所以cookie不能是HttpOnly。此外,我觉得在非完全保护的cookie中共享令牌不是一个好主意。但这似乎是AngularJS推荐的解决方案。。。

那么,如果我放弃这个解决方案,我还能得到什么呢?是否将令牌不放在cookie中,而是放在响应标头中?它安全吗?公开获取令牌的服务?看起来很实用,但不确定这是否是个好主意?公开一个servlet来构建一个Javascript来提供令牌,就像在OWASP Guard中一样?还有别的吗?

EDIT:看来Spring将在HTTP响应中注入令牌名称和值作为解决方案。

谢谢你的帮助!

  1. CSRF令牌应在每个用户会话中生成一次
  2. 它应该存储在服务器端会话中(在Java的情况下为HttpSession)
  3. 客户端应将令牌存储为隐藏参数,而不是存储在浏览器的cookie中
  4. 服务器应验证每个请求的CSRF令牌的存在,并与会话中存储的令牌进行比较

更多详细信息:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_事件_备忘单

最新更新