Java 在调用使无效后重新使用会话ID

Java 在调用使无效后重新使用会话ID,java,jsp,httpsession,jrun,Java,Jsp,Httpsession,Jrun,我继承了一个非常古老的JSP应用程序(JDK1.3.115),并试图填补会话固定漏洞 在使用HttpSession.invalidate()进行身份验证后,我成功地使当前会话无效。但是,当创建新会话时,旧会话ID将被重新使用 <% // login.jsp if (authenticated) { request.getSession().invalidate(); // create new session and store data HttpSession

我继承了一个非常古老的JSP应用程序(JDK1.3.115),并试图填补会话固定漏洞

在使用
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;
}
%>
在我使用
session.invalidate()
之前,第二个
Set Cookie
响应头根本不存在

有人对如何生成新会话ID有什么建议吗?我对JRUN4不太熟悉,但浏览配置文档时没有发现任何问题。

从的第7.3节中,您可以看到:

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


这是一个非常糟糕的想法,但我想知道是否只是重复使用了JSESSIONID cookie,而实际的会话上下文被破坏了。您仍然可以访问无效会话的状态(即属性)吗?

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

是否有可能在调用
session.invalidate()
之前,某些内容正在写入outputStream?例如,scriptlet(
)标记之外的任何内容?@mattb Nope已经解决了这个问题。新会话肯定是在调用
invalidate()
之后创建的,我只想扔掉“JRUN”(或者任何我在这里不希望得到太多社区支持的东西),然后使用一个真正的、体面的servlet容器。Tomcat和Jetty是很好的轻量级替代品。试试看。说服你的经理。我知道这在技术上并不能回答您的问题,但这也只是一个注释:)祝您好运。@BalusC不是一个选项不幸的是,所有会话对象都不受
invalidate()
调用的约束。似乎大多数其他容器都会为新会话分配一个新ID,只是没有JRun@Phil:当然可以,因为分配新ID最有意义。但是,如果JRun按照字面意思解释规范,那么似乎没有特别的需要。@Phil:我只是尝试了Tomcat 7.0.12和WebSphere 7.0。他们会立即分配一个新的JSESSIONID-享受JRun:-)@hoipolloi:我不同意,这是一个安全问题。登录后,您可以切换到HTTPS,因此您需要一个新ID,至少在旧ID未经安全传输的情况下是如此。@home:规范中在哪里说明了这一点?别误会,我不是在为这个实现辩护;只是试图理解为什么JRun会做这样一件违反直觉的事情。如果客户端禁用了Cookie怎么办?那么您需要采取与禁用Cookie时JSESSIONID相同的方法将id附加到URL。方法
HttpServletRequest.isRequestedSessionIdFromURL()
可用于确定会话是通过cookie还是附加进行管理。然后,您需要创建一个实用程序,将辅助会话id附加到URL。您还需要一个Servlet过滤器,如下所述:除了您还需要返回带有辅助会话id的URL之外。如果我们必须自己实现会话处理之类的基本功能,那么这是一个相当差劲的容器。
-- 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=/