2013-10-02 23 views
1

如何在struts2中的有效会话期间拥有持久令牌值(或Form Key)? 当表格中有<s:token/>时,提交表单后,令牌的值发生变化。它会导致用户无法打开2个浏览器选项卡并使用它们的问题(由于每个表单的令牌唯一值,只有一个选项卡处于活动状态)。 如何用struts2解决这个问题,并且每个会话的持久令牌值为(不是每个表格)如何在struts2中获得每会话令牌值

我想重写拦截器就可以解决问题,但我想 考虑其他的选择

+0

这样做的目的是什么? –

+0

@RomanC:这会导致用户无法打开2个浏览器选项卡并使用它们的问题(由于每个表单中令牌的唯一值,只有一个选项卡处于活动状态) –

+0

这不正确,该令牌是根据请求生成的。 –

回答

0

Don't use token at all

如果您需要为每个会话的东西,使用会话本身。令牌旨在防止请求重放攻击。所以每个会话只有一个没有意义。

+0

请看这个链接: http://stackoverflow.com/questions/10466241/new-csrf-token-per-request-or-not 和这个聊天: http://chat.stackoverflow.com/rooms/10926/laurencei-and-zerkms讨论 ---- 结论:每会话令牌,防止CSRF攻击。不是吗? –

+0

@AminSh这个答案没有意义,可能它有一种幽默感,但没有更多。 OWASP对每个会话标记没有任何反应,但是此标记不能用于防止双重提交。 –

+0

每个会话的令牌可以是一个防止CSRF,它必须是会话ID以外的东西http://security.stackexchange.com/questions/22903/why-refresh-csrf-token-per-form-request,尽管struts令牌似乎是最好的双重提交它也可以用作CSRF预防。 –

0

我也有同样的问题,在我的功能有预览,在新标签打开。用户可以预览多次,所以它会抛出一个令牌异常。我有一个代码,在功能开始我写道:

String downloadTokenName = TokenHelper.getTokenName(); 
String downloadToken = TokenHelper.getToken(downloadTokenName); 

在函数结束在最后我重新分配令牌值:

TokenHelper.setSessionToken(downloadTokenName, downloadToken); 

它解决了我的问题。