我正在維護一個Java Web應用程序。httpservletrequest - 創建新會話/更改會話Id
查看登錄代碼,它通過HttpServletRequest的getSession()方法從HttpServletRequest中獲取HttpSession。 (它使用會話中的一些值進行身份驗證)
但是我擔心會話修復攻擊,所以在使用初始會話之後,我想要啓動新會話或更改會話ID。這可能嗎?
我正在維護一個Java Web應用程序。httpservletrequest - 創建新會話/更改會話Id
查看登錄代碼,它通過HttpServletRequest的getSession()方法從HttpServletRequest中獲取HttpSession。 (它使用會話中的一些值進行身份驗證)
但是我擔心會話修復攻擊,所以在使用初始會話之後,我想要啓動新會話或更改會話ID。這可能嗎?
Servlet 3.0 API不允許您更改現有會話上的會話ID。通常情況下,爲了防止會話固定,您只需要創建一個新會話並使舊會話無效。
您可以作廢這樣
request.getSession(false).invalidate();
一個會話,然後用
getSession(true)
(getSession()
應該也可以工作)創建一個新的會話
顯然,如果你在會話中有一個數據你想堅持下去,你需要將它從第一次會議複製到第二次會議。
請注意,對於會話固定保護,通常認爲只需在身份驗證請求上執行此操作即可。但更高級別的安全性涉及拋棄舊會話並針對每個請求進行新會話。
由於Java EE 7和Servlet API 3.1(Tomcat 8)可以使用HttpServletRequest.changeSessionId()來實現此類行爲。還有一個聽衆HttpSessionIdListener
將在每次更改後調用。
Shiro和changeSessionId是一個強大的組合。它允許我寫我的熔岩邏輯沒有分心'如果(成功)request.changeSessionId()'不需要重寫,我是nere – lrn2prgrm 2016-11-24 09:16:09
當getSession之前沒有被調用過,是不是應該給出NullPointerException? – FRotthowe 2010-02-22 14:36:58
的確如此,但我認爲我們假設會議存在。 – pablochan 2010-02-22 14:38:08
如果您使用'getSession()'而不是'getSession(boolean)'',我會鼓勵您。 – BalusC 2010-02-22 14:41:11