java – 调用invalidate后重新使用会话ID

前端之家收集整理的这篇文章主要介绍了java – 调用invalidate后重新使用会话ID前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我继承了一个非常古老的JSP应用程序(JDK 1.3.1_15),并试图插入会话固定漏洞.

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

  1. <%
  2. // login.jsp
  3. if (authenticated) {
  4. request.getSession().invalidate();
  5. // create new session and store data
  6. HttpSession session = request.getSession();
  7. session.putValue(...);
  8. // etc
  9. response.sendRedirect("logged-in.jsp");
  10. return;
  11. }
  12. %>

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

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

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

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

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

猜你在找的Java相关文章