【发布时间】: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