2010-02-22 104 views
31

我正在維護一個Java Web應用程序。httpservletrequest - 創建新會話/更改會話Id

查看登錄代碼,它通過HttpServletRequest的getSession()方法從HttpServletRequest中獲取HttpSession。 (它使用會話中的一些值進行身份驗證)

但是我擔心會話修復攻擊,所以在使用初始會話之後,我想要啓動新會話或更改會話ID。這可能嗎?

回答

37

Servlet 3.0 API不允許您更改現有會話上的會話ID。通常情況下,爲了防止會話固定,您只需要創建一個新會話並使舊會話無效。

您可以作廢這樣

request.getSession(false).invalidate(); 

一個會話,然後用

getSession(true)getSession()應該也可以工作)創建一個新的會話

顯然,如果你在會話中有一個數據你想堅持下去,你需要將它從第一次會議複製到第二次會議。

請注意,對於會話固定保護,通常認爲只需在身份驗證請求上執行此操作即可。但更高級別的安全性涉及拋棄舊會話並針對每個請求進行新會話。

+3

當getSession之前沒有被調用過,是不是應該給出NullPointerException? – FRotthowe 2010-02-22 14:36:58

+0

的確如此,但我認爲我們假設會議存在。 – pablochan 2010-02-22 14:38:08

+3

如果您使用'getSession()'而不是'getSession(boolean)'',我會鼓勵您。 – BalusC 2010-02-22 14:41:11

23

由於Java EE 7和Servlet API 3.1(Tomcat 8)可以使用HttpServletRequest.changeSessionId()來實現此類行爲。還有一個聽衆HttpSessionIdListener將在每次更改後調用。

+0

Shiro和changeSessionId是一個強大的組合。它允許我寫我的熔岩邏輯沒有分心'如果(成功)request.changeSessionId()'不需要重寫,我是nere – lrn2prgrm 2016-11-24 09:16:09