Struts 6.2.0 中的 CSRF 实现错误

CSRF implementation error in struts 6.2.0

提问人:SHIVAM AGRAHARI 提问时间:7/14/2023 最后编辑:Roman CSHIVAM AGRAHARI 更新时间:8/4/2023 访问量:127

问:

我正在尝试在 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

java struts2 csrf struts csrf-token

评论

0赞 SHIVAM AGRAHARI 7/18/2023
仍然不工作
0赞 Roman C 8/4/2023
已更新,请参阅下面的详细信息。

答:

0赞 Roman C 7/17/2023 #1

要使用 中定义的拦截器,您应该添加注释struts.xml

@ParentPackage("struts-security")

您正在尝试使用

tokenSession 拦截器

此拦截器基于 ,提供用于处理无效令牌的高级逻辑。与普通令牌拦截器不同,此拦截器将尝试在使用同一会话的多个请求时提供智能故障转移。也就是说,它将阻止后续请求,直到第一个请求完成,然后它不会返回代码,而是尝试显示与原始有效操作调用相同的响应,如果首先没有提交多个请求。TokenInterceptorinvalid.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.tokenit will attempt to display the same response that the original...
0赞 Roman C 9/6/2023
如果这个答案对你有帮助,那么你应该把它标记为接受。我在答案左边的复选框。此外,值得投票支持帮助您的答案,以帮助其他人选择正确的答案。