我试图通过在用户登录后更改JSESSIONID来防止会话修复漏洞。
我使用SessionVar
来存储用户数据,S.session.open_!.destroySessionAndContinueInNewSession
使旧会话无效并在登录时创建新会话。
然而,它不起作用。 JSESSIONID
的值根本不会改变。它仍然是一样的。
我也尝试使用以下方式注销:
S.session.open_!.destroySession()
S.request.foreach(_.request.session.terminate)
触发会话ID重置。但是,它也不起作用。
我们如何在liftweb登录时更改JSESSIONID的值?
答案 0 :(得分:2)
使用Lift有两种类型的会话。有一个容器会话,并且在一个绑定到JSESSIONID的Servlet环境中,还有LiftSession,这是Lift的抽象。 Lift将其自己的会话绑定到容器会话,但它不直接负责容器如何生成和维护会话。
据我所知,上面的所有代码片段都会导致调用javax.servlet.http.HttpSession.invalidate(),但之后由容器来处理为客户端生成新ID的问题。我的猜测是,当发送响应时,您的容器没有取消设置JSESSIONID cookie,当客户端发出下一个请求时,容器使用所请求的ID启动新会话。
我认为你想要做的是研究你的容器(Jetty,Tomcat等)如何处理与现有会话无关的JSESSIONID值的请求,以及它是否正在使用所请求的值,即使是会话尚不存在,如何禁用该功能。 This SO question可能有所帮助。