我需要实现一个解决方案,以防止基于struts 1框架的应用程序中的CSRF攻击。 在网络上,人们建议这些解决方案:
目前我不知道哪一个最适合这个问题。 那么你能否就这些解决方案给我你的意见,以指导我的选择,如果可能的话,举个例子 或建议其他解决方案。
感谢您的帮助
答案 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 saveToken
和isTokenValid
方法,我认为是一样的。这是一个有限的功能,我会使用更完整的产品。