我正在开发一个非常安全的java Web应用程序,所以我在SSL服务器上启用了CSRF,并应用了spring security和spring MVC;我使用POST成功提交所有表单以及生成的CSRF令牌,但是有些页面有GET方法,如果有任何攻击者从任何浏览器打开任何页面的源,他可以在Form标签内看到生成的CSRF令牌,那么他可以使用只要会话被攻击用户激活,它就会将任何内容发布到我们的网站!我是对的吗?
我该怎么做才能使网站更安全?我应该使用任何其他开源以及spring security来覆盖其他攻击,如跨站点脚本等。?我应该强制所有页面使用POST来避免任何CSRF攻击吗?
更新
我尝试通过客户端工具在同一会话下使用与登录用户相同的令牌在相同的浏览器上提交请求进行更多测试但是它失败了,响应表示登录失败,并且标题包含nosniff
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
所以我认为在Spring安全性中使用GET处理csrf是安全的,而不会害怕读取GET页面中的令牌,除非攻击者使用XSS攻击进行提交
答案 0 :(得分:3)
攻击者可以看到自己的CSRF令牌,但他看不到其他用户的CSRF令牌。不同的用户有不同的令牌,使用错误的令牌不起作用。
所以这里没有什么值得担心的。不要惊慌。
答案 1 :(得分:0)
然而有些页面有GET方法,如果有攻击者打开了 他可以从任何浏览器看到生成的CSRF的任何页面的来源 在Form标签内的令牌,然后他可以使用它来POST任何内容 我们的网站只要会话被攻击用户激活!! 我是对的吗?
是的,你是对的,使用GET会让你的网站泄露敏感信息。这正是Spring Security和RFC Specification不鼓励使用GET请求发送敏感信息的原因。如果您要发送CSRF令牌,则应该POST。
我该怎么做才能使网站更安全?我应该使用任何其他 开源以及Spring安全性来覆盖其他类似的攻击 跨站点脚本等。?
Spring Security框架不是Silver Bullet。使用它不会神奇地使您的Web应用程序100%安全。尽管它涵盖了大多数安全漏洞,但我们必须确保以不引入任何安全漏洞的方式编写代码。
例如:
对于跨站点脚本,即使您使用Spring Security,如果您从HTML输入框中获取值并直接保存而不对其进行HTML编码,并将其显示回${value}
之类的JSP文件中将介绍XSS的可能性。