Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从服务器到AngularJS客户端的CSRF令牌交换_Java_Angularjs_Csrf_Csrf Protection - Fatal编程技术网

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

Java 从服务器到AngularJS客户端的CSRF令牌交换,java,angularjs,csrf,csrf-protection,Java,Angularjs,Csrf,Csrf Protection,我想知道如何为我的Web应用程序实现CSRF保护,这让我发疯了。我已经读了很多页,但仍然无法在我的特定环境中决定解决方案 因此,首先,我的Web应用程序是用Angular编写的,静态部署在Apache服务器上。它调用我的服务器上的一些服务,Java类型,部署在应用服务器上的war中。它们都部署在同一个域上。身份验证后,在响应中设置通常的会话cookie(secure+HttpOnly) 现在,我想基于同步器令牌或双提交cookie模式实现CSRF保护(但从我看到的第一个解决方案更好,因为我可以处

我想知道如何为我的Web应用程序实现CSRF保护,这让我发疯了。我已经读了很多页,但仍然无法在我的特定环境中决定解决方案

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

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

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

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

编辑:Spring似乎打算在HTTP响应中注入令牌名称和值作为解决方案

谢谢你的帮助

  • 每个用户会话应生成一次CSRF令牌
  • 它应该存储在服务器端会话中(对于Java,则为HttpSession)
  • 客户端应将令牌作为隐藏参数存储,而不是存储在浏览器的cookie中
  • 服务器应验证每个请求是否存在CSRF令牌,并与会话中存储的令牌进行比较

  • 更多细节:

    是的,所有这些都很清楚。我错过的是如何以安全、干净的方式将服务器端生成的cookie传输到客户端Java EE应用程序将令牌作为请求属性传递回客户端。对于AngularJS客户端,我假设您可以使用JSONYou传递令牌,例如,作为登录响应的一部分?