httpservletrequest - 创建新会话/更改会话 ID
我正在维护一个Java Web应用程序。
查看登录代码,它通过 HttpServletRequest 的 getSession() 方法从 HttpServletRequest 中获取 HttpSession。(它使用会话中的某些值进行身份验证)
但是,我担心会话固定攻击,因此在使用初始会话后,我想启动新会话或更改会话ID。这可能吗?
我正在维护一个Java Web应用程序。
查看登录代码,它通过 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