java httpservletrequest创建新会话/更改会话Id
我正在维护一个Java web应用程序
查看登录代码,它通过HttpServletRequest的getSession()方法从HttpServletRequest获取HttpSession。(它在会话中使用一些值进行身份验证)
但是我担心会话固定攻击,所以在使用初始会话后,我想启动新会话或更改会话id。这可能吗
我正在维护一个Java web应用程序
查看登录代码,它通过HttpServletRequest的getSession()方法从HttpServletRequest获取HttpSession。(它在会话中使用一些值进行身份验证)
但是我担心会话固定攻击,所以在使用初始会话后,我想启动新会话或更改会话id。这可能吗
# 1 楼答案
Servlet3.0API不允许您更改现有会话上的会话id。通常,为了防止会话固定,您只需要创建一个新会话,并使旧会话无效
您可以使这样的会话无效
request.getSession(false).invalidate();
然后使用创建一个新会话
getSession(true)
(getSession()
也应该可以)显然,如果会话中有要持久化的数据,则需要将其从第一个会话复制到第二个会话
注意,对于会话固定保护,通常认为只要在身份验证请求上执行此操作就可以了。但是,更高级别的安全性包括丢弃旧会话,并为每个请求创建新会话
# 2 楼答案
由于JavaEE7和ServletAPI3.1(Tomcat8),您可以使用HttpServletRequest.changeSessionId()来实现这种行为。还有一个监听器
HttpSessionIdListener
,它将在每次更改后调用