安全性:在struts 1中实施针对CSRF攻击的解决方案

时间:2015-11-12 08:18:49

标签: java security csrf struts-1 struts1

我需要实现一个解决方案,以防止基于struts 1框架的应用程序中的CSRF攻击。 在网络上,人们建议这些解决方案:

  • Struts saveToken(request)和isTokenValid(request,true)
  • HDIV和OWASP CSRFGuard等图书馆

目前我不知道哪一个最适合这个问题。 那么你能否就这些解决方案给我你的意见,以指导我的选择,如果可能的话,举个例子 或建议其他解决方案。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果您只关心CSRF而不关心其他OWASP安全问题,我建议您选择内置支持的Struts,即Synchronizer Token Pattern,而不是使用任何外部库。

Struts Survival指南中的Synchronizer模式摘录。

  

要了解Synchronizer Token的工作原理,请参阅一些背景知识   Action类中的内置功能是必需的。那个行动   class有一个名为saveToken()的方法,其逻辑如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <include
            android:id="@+id/map_toolbar"
            layout="@layout/app_bar" />

        <LinearLayout
            android:id="@+id/map_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
               <fragment xmlns:android="http://schemas.android.com/apk/res/android"
                    android:id="@+id/map"
                    android:name="com.google.android.gms.maps.SupportMapFragment"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />
        </LinearLayout>
    </LinearLayout>
     

该方法使用会话ID,当前时间和生成随机令牌   MessageDigest并使用密钥名称将其存储在会话中   org.apache.struts.action.TOKEN(这是静态的值   org.apache.struts.Globals类中的变量TRANSACTION_TOKEN_KEY。该   呈现表单的Action类调用saveToken()方法   使用以上名称创建会话属性。在JSP中,你有   将令牌用作隐藏表单字段,如下所示:

HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
 session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token);
}
     

嵌入式&lt; bean:write&gt;上面显示的标签,查找名为的bean   org.apache.struts.action.TOKEN(这是Globals的值。   TRANSACTION_TOKEN_KEY)在会话范围内并将其值呈现为   隐藏输入变量的value属性。隐藏的名称   输入变量是org.apache.struts.taglib.html.TOKEN(这没什么   但是类中的静态变量TOKEN_KEY的值   org.apache.struts.taglib.html.Constants)。当客户提交时   表格,隐藏字段也提交。在处理的Action中   表单提交(很可能与Action不同)   在呈现表单的情况下,比较表单提交中的标记   使用isTokenValid()方法在会话中使用令牌。该   method比较两个标记,如果两个标记相同则返回true。是   一定要在isTokenValid()方法中传递reset =“true”来清除   比较后来自会话的令牌。如果两个令牌相等,那么   表格是第一次提交。但是,如果两个令牌都这样做   不匹配或者如果会话中没有令牌,则它是一个   重复提交并以您可接受的方式处理   用户。

答案 1 :(得分:0)

使用HDIV可以防止CSRF攻击而不仅仅是这样。您可以避免90%的OWASP Top 10.因此,如果您想开发更安全的软件,我建议您使用HDIV。

CSRFGuard是一个很好的库,可以防止CSRF,但仅限于此。如您所知,了解多个产品需要时间,在这种情况下,如果您可以避免更多类型的攻击,更完整的解决方案会更好。

关于Struts saveTokenisTokenValid方法,我认为是一样的。这是一个有限的功能,我会使用更完整的产品。