httpservletrequest - 创建新会话/更改会话ID

AJM*_*AJM 35 java session servlets

我正在维护一个Java Web应用程序.

查看登录代码,它通过HttpServletRequest的getSession()方法从HttpServletRequest中获取HttpSession.(它使用会话中的一些值进行身份验证)

但是我担心会话固定攻击,所以在我使用初始会话后,我想要开始一个新会话或更改会话ID.这可能吗?

pab*_*han 41

Servlet 3.0 API不允许您更改现有会话的会话ID.通常,为了防止会话固定,您只需创建一个新的并使旧的无效.

您可以使这样的会话无效

request.getSession(false).invalidate();
Run Code Online (Sandbox Code Playgroud)

然后创建一个新的会话

getSession(true)(也getSession()应该工作)

显然,如果会话中有要保留的数据,则需要将其从第一个会话复制到第二个会话.

注意,对于会话固定保护,通常认为可以在身份验证请求上执行此操作.但是更高级别的安全性涉及抛弃旧会话并为每个请求创建新会话.

  • @BalusC,你会创建一个会话并立即删除它,如果它之前不存在.做什么的?`request.getSession(false).invalidate();`带有空检查的`是正确的答案. (7认同)
  • 当之前没有调用getSession时,是不应该给出NullPointerException? (3认同)
  • 如果你使用`getSession()`而不是`getSession(boolean)`,我会赞成你. (3认同)

Jak*_*ski 27

从Java EE 7和Servlet API 3.1(Tomcat 8)开始,您可以使用HttpServletRequest.changeSessionId()来实现此类行为.HttpSessionIdListener每次更改后都会调用一个侦听器.