提问人:SHIVAM AGRAHARI 提问时间:7/14/2023 最后编辑:Roman CSHIVAM AGRAHARI 更新时间:8/4/2023 访问量:127
Struts 6.2.0 中的 CSRF 实现错误
CSRF implementation error in struts 6.2.0
问:
我正在尝试在 Struts 6.2.0 项目中实现 CSRF。
struts.xml
<package name="struts-security" abstract="true" extends="struts-default">
<interceptors>
<interceptor-stack name="defaultSecurityStack" />
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor" />
<interceptor name="tokenSessionStore" class= "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
</interceptors>
<default-interceptor-ref name = "defaultSecurityStack" />
<global-results>
<result name="error">/error401.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception" />
</global-exception-mappings>
LoginAction.java
@Namespace("/common")
@Action("Login")
@InterceptorRefs({
@InterceptorRef("token"),
@InterceptorRef("tokenSessionStore")
})
@Results({
@Result(name = "input", location = "login.Login", type = "tiles"),
})
login.jsp
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:form method="post" validate="true" theme="simple" name="form" id="paraFrm" >
<s:token />
它正在返回.因为我添加了退货页面,所以它重定向到错误页面。是否需要额外的代码才能在操作页面或任何其他地方实现令牌。invalid.token
答:
0赞
Roman C
7/17/2023
#1
要使用 中定义的拦截器,您应该添加注释struts.xml
@ParentPackage("struts-security")
您正在尝试使用
tokenSession
拦截器:
此拦截器基于 ,提供用于处理无效令牌的高级逻辑。与普通令牌拦截器不同,此拦截器将尝试在使用同一会话的多个请求时提供智能故障转移。也就是说,它将阻止后续请求,直到第一个请求完成,然后它不会返回代码,而是尝试显示与原始有效操作调用相同的响应,如果首先没有提交多个请求。
TokenInterceptor
invalid.token
示例代码:
<action name="someAction" class="com.examples.SomeAction"> <interceptor-ref name="tokenSession"/> <interceptor-ref name="basicStack"/> <result name="success">good_result.ftl</result> </action> <-- In this case, myMethod of the action class will not get checked for invalidity of token --> <action name="someAction" class="com.examples.SomeAction"> <interceptor-ref name="tokenSession"> <param name="excludeMethods">myMethod</param> </interceptor-ref name="tokenSession> <interceptor-ref name="basicStack"/> <result name="success">good_result.ftl</result> </action>
正如您在示例中看到的,您缺少一些基本的拦截器。
这些拦截器在继承的包中定义。因此,您不应该覆盖它们。只需从标记中删除这些拦截器,或改用标记即可。
只应为操作配置一个令牌拦截器。因为两者都使用来自浏览器的相同令牌,所以它们是互斥的。struts-default
<interceptors>
<intetceptor-ref>
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor" />
<interceptor name="tokenSessionStore" class= "org.apache.struts2.interceptor.TokenSessionStoreInterceptor" />
如果要创建自定义拦截器堆栈并将其用于每个操作,请检查此答案。
评论
0赞
SHIVAM AGRAHARI
7/18/2023
仍然不工作
0赞
Roman C
7/18/2023
什么不起作用?
0赞
SHIVAM AGRAHARI
7/20/2023
它直接重定向到错误页面。
0赞
Roman C
8/3/2023
你说它返回一个结果代码。.如何返回错误页面?错误代码是什么?invalid.token
it will attempt to display the same response that the original...
0赞
Roman C
9/6/2023
如果这个答案对你有帮助,那么你应该把它标记为接受。我在答案左边的复选框。此外,值得投票支持帮助您的答案,以帮助其他人选择正确的答案。
评论