struts 6.2.0中CSRF实现错误

问题描述 投票:0回答:1

我正在尝试在 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
1个回答
0
投票

要使用

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

@ParentPackage("struts-security")

您正在尝试使用

tokenSession
拦截器。

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>

正如您在示例中看到的,您缺少一些基本的拦截器。

© www.soinside.com 2019 - 2024. All rights reserved.