【问题标题】: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 saveTokenisTokenValid 方法,我也这么认为。这是一个有限的功能,我会使用更完整的产品。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-05
        • 2017-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        相关资源
        最近更新 更多