2013-10-02 28 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); 

它解決了我的問題。