【发布时间】:2017-11-10 17:17:34
【问题描述】:
我正在尝试在 struts2 中开发一个应用程序,其中我有多种形式,可能有也可能没有相同的动作。为了避免 CSRF,我还使用这些表单添加了令牌,但一次只能使用一个令牌。如果我单击另一个提交按钮,那么我将重定向到为 CSRF 配置的错误页面。我被困在这里为什么会发生这种情况,无法在同一页面上使用多个令牌,或者有任何解决方案。
请找到我配置的struts2.xml代码。
<action name="expUsers" class="com.org.action.ExpUser">
<interceptor-ref name="CSRFStack"/>
<result name="invalid.token" type="tiles">csrfError</result>
<result name="success" type="stream">
<param name="contentDisposition">contentDisposition</param>
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
</result>
<result name="failed" type="chain">csrfError</result>
</action>
我在下面有以下虚拟表单示例,可以让您了解我在做什么。
<form id="form-1">
<s:token/>
....
</form>
<form id="form-2">
<s:token/>
....
</form>
<form id="form-3">
<s:token/>
....
</form>
... so on multiple forms with token.
【问题讨论】:
-
@Monoj 我认为由于令牌是唯一的(对于每个请求)...对于该令牌,只会接受一次提交或请求!这就是不允许对一个令牌的多次请求:) :)
-
您不应该对两种表单使用相同的标记。
-
然后如何为每个表单生成不同的令牌,因为无论我有什么表单,我为每个表单生成新的令牌。我将有多个基于数据库记录的表单。
-
如果用户返回并点击另一个表单,那么在第一次请求使用令牌后表单应该可以工作。
-
通过浏览器返回按钮返回?第一种形式也应该起作用吗?不要忘记提及他人,以便他们可以收到@ManojSharma 的通知。