我正在维护一个Java Web应用程序。
查看登录代码,它通过HttpServletRequest的getSession()方法从HttpServletRequest中获取HttpSession。 (它使用会话中的一些值进行身份验证)
但是我担心会话固定攻击所以在我使用初始会话之后我想要开始新会话或更改会话ID。这可能吗?
答案 0 :(得分:40)
Servlet 3.0 API不允许您更改现有会话的会话ID。通常,为了防止会话固定,您只需创建一个新的并使旧的无效。
您可以使此会话无效
request.getSession(false).invalidate();
然后使用
创建一个新会话 getSession(true)
(getSession()
也应该有用)
显然,如果会话中有要保留的数据,则需要将其从第一个会话复制到第二个会话。
注意,对于会话固定保护,通常认为可以在身份验证请求上执行此操作。但是更高级别的安全性涉及抛弃旧会话并为每个请求创建新会话。
答案 1 :(得分:25)
从Java EE 7和Servlet API 3.1(Tomcat 8)开始,您可以使用HttpServletRequest.changeSessionId()来实现此类行为。还有一个监听器HttpSessionIdListener
,每次更改后都会调用它。