【问题标题】:Can a Servlet get HTTPS session id?Servlet 可以获取 HTTPS 会话 ID 吗?
【发布时间】:2011-09-10 07:07:09
【问题描述】:

我想使用 Java Servlet 构建一个无状态的 Web 应用程序。因为是无状态的,所以没有HttpSession。浏览器中有一个会话,但每个请求可能由集群中的不同节点处理。存储在浏览器中的会话标识符是由服务器生成和加密的,因此很难有人伪造一个有效的假会话 ID 并绕过登录。

最近我在这个架构中发现了一个漏洞:如果恶意(被感染)浏览器将会话标识符发送给强盗,会话很容易被劫持。我无法在每个请求中重新生成会话标识符,因为服务器上没有会话来跟踪预期的请求序列,这也会使异步请求的处理变得复杂。

到目前为止,我的解决方案是获取一些 HTTPS 会话标识符并将其包含在存储在浏览器中的加密会话 ID 中。标准 servlet 能否从 HTTPS 连接中获取此类信息?

另一种选择是仅将 HttpSession 用于 getId(),但仅当此类 ID 绑定到 HTTPS 会话时才有效,而我在 servlet 规范中找不到。

欢迎提出其他建议。

【问题讨论】:

  • 验证 ssl 会话将提高您的安全性,但如果浏览器感染了恶意软件,那么您将无法信任该浏览器。 ssl 实现也可能受到破坏,浏览器可能由远程代理控制等。但是,此解决方案可以防止只有浏览器中的 cookie 受到破坏的特定攻击。
  • 验证 SSL 会话 ID 并不能真正提高安全性。我不确定这个神话是从哪里来的。不过,它肯定会给合法用户带来问题。

标签: java security session servlets https


【解决方案1】:

servlet 容器在 HttpServletRequest 属性中填充 SSL 会话 ID,以供下游组件使用。属性名称恰好是javax.servlet.request.ssl_session_id。据我所知,这在所有实现 Servlet 规范 3.0 的容器中都可用。在 Servlet Spec 3.0 之前,如果我没记错的话,这在有限的容器中可用 - Tomcat 和 Jetty。

但请注意,SSL 会话 ID 被认为比容器生成的 HTTP 会话 cookie 值更安全。泄露 SSL 会话 ID 甚至会使您的 HTTPS 连接变得不安全。

【讨论】:

  • SSL 会话 ID 与 HTTP“会话”的用途完全无关。不同的 SSL 会话 ID 并不表示它来自其他人,它只是保持 SSL/TLS 会话进行的机制(即应用程序下的连接)。相比之下,通过 cookie 的 HTTP 会话用于在本质上是请求-响应协议 (HTTP) 中跟踪“对话”。 SSL 会话 ID 不应用于身份验证。使用它们不会“提高”安全性,它只是将“会话”限制为 SSL 连接的生命周期(通常很短)。
  • @Bruno,某些应用服务器在使用 SSL/TLS 时不使用 HTTP Cookie 来跟踪状态,而是使用 SSL 会话 ID。我记得 OC4J 曾经这样做,并且有可用的配置标志以防有人想使用 JSESSIONID cookie 发送会话 ID。您是对的,因为 SSL 会话 ID 的寿命不如正常的 HTTP 会话 cookie 值。我不记得服务器如何将 SSL 会话 ID 映射到服务器端会话对象的详细信息,但它肯定是可能的。
  • 确实,我不是说这不可能,我是说这不是正确的做法,因为它会导致更多的问题。 Cookie 位于 HTTP 之上,用于在 HTTP 之上提供“对话”层(否则为无状态)。 SSL 会话 ID 位于 HTTP 下。例如,如果您的浏览器打开多个连接以并行获取页面及其图像,它可能会合法地以具有不同 SSL 会话 ID 的多个 SSL 连接结束。假设 SSL 会话相同依赖于具有相当稳定的连接(在移动环境中可能会出现问题)。
  • SSL 会话 ID 相对于 cookie 的优势实际上并不存在。 cookie 至少在加密的 SSL/TLS 连接中受到保护。 SSL 会话 ID 在握手中清晰可见。
  • @Bruno,我完全不同意你的观点。 OP 可能更了解他试图解决的问题。我们只能解释为什么某些事情是坏主意。恐怕我应该早点解释一下(在我的帖子中)。
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多