【问题标题】:Security: implementing a solution against CSRF attacks in struts 1安全性:在 struts 1 中实现针对 CSRF 攻击的解决方案
【发布时间】:2016-02-13 12:19:30
【问题描述】:
我需要在基于 struts 1 框架的应用程序中实现一个解决方案来防止 CSRF 攻击。
在网络上,人们提出以下解决方案:
- Struts saveToken(request) 和 isTokenValid(request, true)
- HDIV 和 OWASP CSRFGuard 等库
目前我不知道哪一个最适合这个问题。
那么,您能否就这些解决方案发表您的意见以指导我的选择,并在可能的情况下举个例子
或建议其他解决方案。
感谢您的帮助
【问题讨论】:
标签:
java
security
csrf
struts-1
struts1
【解决方案1】:
如果您只关心 CSRF 而不是其他 OWASP 安全问题,我建议您使用 Struts 内置支持,即同步器令牌模式,而不是使用任何外部库。
Struts Survival 指南中有关 Synchronizer 模式的摘录。
要了解 Synchronizer Token 的工作原理,了解一些关于
Action 类中的内置功能是必需的。那个行动
类有一个叫saveToken()的方法,其逻辑如下:
HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}
该方法使用会话 id、当前时间和
MessageDigest 并使用键名将其存储在会话中
org.apache.struts.action.TOKEN(这是静态的值
org.apache.struts.Globals 类中的变量 TRANSACTION_TOKEN_KEY。这
呈现表单的动作类调用 saveToken() 方法
创建具有上述名称的会话属性。在 JSP 中,您有
将令牌用作隐藏的表单字段,如下所示:
<input type="hidden"
name="<%=org.apache.struts.taglib.html.Constants.TOKEN_KEY%>"
value="<bean:write name="<%=Globals.TRANSACTION_TOKEN_KEY%>"/>">
嵌入的 标记如上所示,查找名为
org.apache.struts.action.TOKEN (这是 Globals 的值。
TRANSACTION_TOKEN_KEY ) 在会话范围内并将其值呈现为
隐藏输入变量的值属性。隐藏的名字
输入变量是 org.apache.struts.taglib.html.TOKEN (这没什么
但是类中静态变量TOKEN_KEY的值
org.apache.struts.taglib.html.Constants)。当客户提交
表单,隐藏字段也提交。在处理的动作中
表单提交(很可能与 Action 不同)
渲染表单),比较表单提交中的令牌
使用 isTokenValid() 方法在会话中使用令牌。这
方法比较两个标记,如果两者相同,则返回 true。是
确保在 isTokenValid() 方法中通过 reset="true" 来清除
比较后来自会话的令牌。如果两个令牌相等,则
表格是第一次提交。但是,如果这两个令牌
不匹配或者如果会话中没有令牌,那么它是一个
重复提交并以您可接受的方式处理
用户。
【解决方案2】:
使用 HDIV 不仅可以防止 CSRF 攻击。你可以避开 90% 的 OWASP Top 10。所以,如果你想开发更安全的软件,我建议你使用 HDIV。
CSRFGuard 是一个很好的库来防止 CSRF,但仅限于此。如您所知,学习多种产品需要时间,在这种情况下,如果您可以避免更多类型的攻击,则更完整的解决方案会更好。
关于 Struts saveToken 和 isTokenValid 方法,我也这么认为。这是一个有限的功能,我会使用更完整的产品。