【发布时间】:2011-10-13 01:48:20
【问题描述】:
我继承了一个非常古老的 JSP 应用程序 (JDK 1.3.1_15),并试图填补会话固定漏洞。
在使用HttpSession.invalidate() 进行身份验证后,我成功地使当前会话无效,但是在创建新会话时,旧的会话 ID 被重新使用。
<%
// login.jsp
if (authenticated) {
request.getSession().invalidate();
// create new session and store data
HttpSession session = request.getSession();
session.putValue(...);
// etc
response.sendRedirect("logged-in.jsp");
return;
}
%>
我可以在我的 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 不是很熟悉,但是翻阅配置文档并没有发现任何东西。
【问题讨论】:
-
是否有可能在调用
session.invalidate()之前将某些内容写入输出流?例如,scriptlet(<%和%>)标签之外的任何内容? -
@mattb 不,已经解决了这个问题。新会话肯定是在调用
invalidate()之后创建的 -
我只是扔掉“JRUN”(或任何它假装的东西,我不希望在这里得到太多社区支持)并使用一个真实而体面的 servlet 容器。 Tomcat 和 Jetty 是不错的轻量级替代品。试一试。说服你的经理。我知道这在技术上并不能回答你的问题,但它也只是一个评论:) 祝你好运。
-
@BalusC 不幸的是,这不是一个选项
标签: java jsp httpsession jrun