会话ID在调用invalidate后重新使用

我inheritance了一个非常古老的JSP应用程序(JDK 1.3.1_15),并试图插入一个会话固定孔。

在使用HttpSession.invalidate()进行身份validation后,我成功地使当前会话无效,但是在创建新会话时,将重新使用旧会话ID。

  

我可以在我的HTTP监视器中看到新的会话分配,它只是再次使用相同的号码。

 -- Initial request response -- HTTP/1.1 200 OK Set-Cookie: JSESSIONID=6a303082951311647336934;path=/ -- login.jsp request response -- HTTP/1.1 302 Moved Temporarily Location: http://example.com/logged-in.jsp Set-Cookie: JSESSIONID=6a303082951311647336934;path=/ 

在我使用session.invalidate()之前,第二个Set-Cookie响应头根本不存在。

有没有人对如何生成新的会话ID有任何建议? 我对JRUN4不是很熟悉,但是通过配置文档进行拖网并没有发现任何东西。

要解决此问题,您可以使用第二个非持久性cookie作为可以控制其值的会话ID。 我们的想法是生成一个唯一的ID并将其存储在cookie和会话中。 通过使用invalidate,尝试使用此cookie尝试对会话执行相同的逻辑。 具体而言,在身份validation成功之前,请不要发出将来接受请求的实际标识符。 然后创建一个Servletfilter,检查每个请求并将此新cookie的值与存储在会话中的值相匹配。 如果他们不匹配,就会发生一些邪恶的事情。 我知道这比仅仅依靠session.invalidate()发布一个新的ID要麻烦一些。 但考虑到你的约束和JRun的行为,这将提供足够的保护,防止会话固定。

从Java Servlet 3.0规范的 7.3节,您可以看到:

HttpSession对象必须在应用程序(或servlet上下文)级别设置范围。 底层机制(例如用于建立会话的cookie)对于不同的上下文可以是相同的 ,但引用的对象(包括该对象中的属性)决不能由容器在上下文之间共享。

这是一个非常糟糕的主意,但我想知道JSESSIONID cookie是否只是被重用并且实际的会话上下文被破坏了。 您是否仍然可以获得无效会话的状态(即属性)?