【发布时间】:2011-05-08 04:49:48
【问题描述】:
在 Java Servlet API 中,做了什么来确保某人的 session id 不被窃取?
例如,如果我有一个活动会话并且有人以某种方式获取了我的会话 ID,他们可以使用它吗?
【问题讨论】:
标签: java security servlets jakarta-ee httpsession
在 Java Servlet API 中,做了什么来确保某人的 session id 不被窃取?
例如,如果我有一个活动会话并且有人以某种方式获取了我的会话 ID,他们可以使用它吗?
【问题讨论】:
标签: java security servlets jakarta-ee httpsession
没有什么能阻止它。拿到会话ID,就可以参与会话了。
在通常的 cookie 情况下,这本身并没有风险。攻击者应该无法读取用户的会话 cookie,除非:
它们具有中间人功能,在这种情况下,您遇到的问题比会话 ID 更糟糕;
您留下了一个跨站点脚本漏洞,在这种情况下,您遇到的问题比会话 ID 更糟糕;
您容易受到 DNS 重新绑定/跨域烹饪攻击,在这种情况下,您应该通过仅允许已知良好的 Host: 请求来解决它。
(虽然您可以尝试将会话绑定到 IP 地址,但这可能会由于循环代理等原因而破坏有效会话。IP 可用作检测可疑活动的更广泛策略的一部分,但在公共互联网上它不是总是要求会话中的每个请求来自同一个 IP 是个好主意。)
不幸的是,在 Servlet 中除了 cookie 之外还有另一种情况:jsessionid= 参数。由于它们出现在 URL 本身中,这使得它们更多更容易泄漏(例如,通过引用和粘贴的链接)。这远不是参数会话 ID 的唯一实际问题。他们搞砸了导航并破坏了 SEO。
在我看来,jsessionid= URL 是 Servlet 最严重的早期错误之一,它是过去不应该用于任何事情的名誉扫地的 cookie 回退策略。但是当然不应该允许他们授予对任何特权数据的访问权限。如果您需要为不支持 cookie 的浏览器提供回退机制,请考虑使用 HTTP 基本身份验证。
在 Servlet 3.0 中,您可以使用 web.xml 中的 <session-config> 轻松禁用 jsessionid= URL;不幸的是,在以前的版本中,如果您想正确禁用该功能,则只能使用过滤器。
【讨论】:
是的,会话 ID 允许某人访问相应的会话。
您可以将登录期间使用的 IP 存储在会话中,当 IP 更改需要用户再次登录时。 此外(不确定这是否是自动完成的)你可以对用户代理做同样的事情——虽然并没有真正提高对恶意攻击的安全性,只是防止愚蠢的用户意外泄露他们的 sessionid,如果它是通过 GET 而不是 cookie 传递的。
【讨论】:
是的,他们可以使用它。除非您将所有流量都放在 SSL 上,否则不会采取任何措施来保护它。
这就是Firesheep 的工作原理,最近因为使会话窃取变得容易而引起了很多关注。
【讨论】: