从服务器到AngularJS客户端

时间:2017-10-06 20:28:55

标签: java angularjs csrf csrf-protection

我疯狂地试图弄清楚如何为我的Web应用程序实现CSRF保护。我已经阅读了大量的页面,但仍然无法在我的特定环境中决定解决方案。

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

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

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

所以,如果我放弃这个解决方案,我还剩下什么? 将令牌放在cookie中而不是放在响应头中?它安全吗? 公开服务以获取令牌?看似实用但不确定这是不是一个好主意? 公开一个servlet来构建一个Javascript以提供令牌,就像在OWASP Guard中一样? 还有什么吗?

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  1. 每个用户会话应生成一次CSRF令牌。
  2. 它应存储在服务器端会话中(如果是Java,则为HttpSession)
  3. 客户端应将令牌存储为隐藏参数,而不是存储在浏览器的Cookie中。
  4. 服务器应验证每个请求是否存在CSRF令牌,并与会话中存储的令牌进行比较。
  5. 更多详情:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet