如何在用户登录liftweb后更改JSESSIONID的值?

时间:2014-04-15 07:48:24

标签: lift jsessionid session-fixation

我试图通过在用户登录后更改JSESSIONID来防止会话修复漏洞。

我使用SessionVar来存储用户数据,S.session.open_!.destroySessionAndContinueInNewSession使旧会话无效并在登录时创建新会话。

然而,它不起作用。 JSESSIONID的值根本不会改变。它仍然是一样的。

我也尝试使用以下方式注销:

S.session.open_!.destroySession()
S.request.foreach(_.request.session.terminate)

触发会话ID重置。但是,它也不起作用。

我们如何在liftweb登录时更改JSESSIONID的值?

1 个答案:

答案 0 :(得分:2)

使用Lift有两种类型的会话。有一个容器会话,并且在一个绑定到JSESSIONID的Servlet环境中,还有LiftSession,这是Lift的抽象。 Lift将其自己的会话绑定到容器会话,但它不直接负责容器如何生成和维护会话。

据我所知,上面的所有代码片段都会导致调用javax.servlet.http.HttpSession.invalidate(),但之后由容器来处理为客户端生成新ID的问题。我的猜测是,当发送响应时,您的容器没有取消设置JSESSIONID cookie,当客户端发出下一个请求时,容器使用所请求的ID启动新会话。

我认为你想要做的是研究你的容器(Jetty,Tomcat等)如何处理与现有会话无关的JSESSIONID值的请求,以及它是否正在使用所请求的值,即使是会话尚不存在,如何禁用该功能。 This SO question可能有所帮助。