【问题标题】:How to reset JSESSIONID如何重置 JSESSIONID
【发布时间】:2011-01-29 09:31:42
【问题描述】:

在用户进行身份验证时重置会话 cookie 被认为是一种良好的安全做法。

如何用 Java 做到这一点?

到目前为止我的尝试是成功的,但我想知道是否有更好的方法:

public static HttpSession resetSessionId(HttpSession session, 
      HttpServletRequest request) {
    session.invalidate();
    session = request.getSession(true);
    return session;
}

【问题讨论】:

  • 我认为这是最好的方式...
  • 我试过你的方法。但是 JSESSIONID 没有重置。你知道为什么吗?我使用 Resin 作为我的 Web 容器。

标签: java jsp servlets


【解决方案1】:

我只传递我从中获取会话的请求。如果会话尚不存在,那么创建一个会话只是为了使其无效是没有意义的。如果会话刚刚由容器创建,这也成立(由于用户直接在登录表单上的第一个 http 请求)。

public static ... (HttpServletRequest request) { 
    HttpSession session = request.getSession(false);
    if (session!=null && !session.isNew()) {
        session.invalidate();
    }

【讨论】:

  • 好吧,在身份验证之前应该存在一个会话(我使用自定义身份验证,没有内置的 http auths)。当用户打开登录页面时,会创建一个会话。
  • 我更喜欢在我的 web 应用程序中创建最佳会话。只有在需要时,Java 代码才会显式创建 http 会话。显示登录表单通常不需要任何状态处理。
  • @Bozho,cherouvim 说的是非常正确的,在身份验证之前处理会话(或所需的任何其他状态)可以很容易地用于 OOM DoS(只需调用创建会话但从不存储的页面,即执行完全相同的 GET 请求)。所以我想这是最好的答案(连同评论)
【解决方案2】:

您的答案似乎是最佳的。另一种方法是以这种方式直接操作厨师:

 Cookie cookie = new Cookie ("JSESSIONID", "randomValue");
 cookie.setMaxAge( 0 );

所以你创建一个具有相同名称的新 cookie 并立即将其过期,但我不建议这样做,因为你的 cookie 更干净,对任何熟悉基本 Servlet API 的人来说都很明显.

【讨论】:

  • 我将实际使用它,因为这样我就可以将“安全”标志设置为 false。 Tomcat 将其设置为true,因为我通过 SSL 进行身份验证
  • 好吧,实际上它不起作用 - 不知何故,它发送了两个相同的 JSESSIONID,而不是覆盖现有的。所以我现在不得不放弃整个重置。但仍然保留公认的答案,因为它是最完整的。
【解决方案3】:

Tomcat(自 6.0.24 AFAIK 起)可以自动更改身份验证时的 sessionId - 只要您使用标准 servlet 身份验证机制(基本的、基于表单的身份验证)。这可以通过基本身份验证器 Valve 的 changeSessionIdOnAuthentication 进行配置:http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html

【讨论】:

    【解决方案4】:

    另一种方法(不是更好的方法)是调用org.apache.catalina.session.StandardManager 的“changeSessionId(existingSession)”,这会将当前会话的会话 ID 更改为随机生成的新会话 ID。

    您必须使用 StandardManager Mbean 来调用该方法。请看Tomcat MBeans

    伪代码:

    ObjectName contextObjectName = new ObjectName("Catalina:type=Manager,path=/whatever,host=whateverhost");

    mbeanServer.invoke(contextObjectName, "changeSessionId", new Object[]{session}, new String[]{"javax.servlet.http.HttpSession"});

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-10
      • 2021-07-22
      • 2019-07-08
      • 2018-09-15
      • 2020-03-09
      • 2016-10-24
      • 1970-01-01
      • 2017-11-24
      相关资源
      最近更新 更多