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