【发布时间】:2012-08-27 08:06:18
【问题描述】:
如何防止多个客户端使用相同的会话 ID?我问这个是因为我想添加一个额外的安全层来防止我的网站上的会话劫持。如果黑客以某种方式找出另一个用户的会话 ID 并使用该 SID 发出请求,我如何检测到服务器上存在共享单个 SID 的不同客户端然后拒绝劫持尝试?
编辑
经过仔细考虑,我接受了 Gumbo 的回答,因为我已经意识到由于 无状态 HTTP 协议的限制,我所要求的是不可能的。我忘记了可能是 HTTP 最基本的原理是什么,现在想想这个问题似乎有点琐碎。
让我详细说明我的意思:
用户 A 在 example.com 上登录后,会获得一些随机会话 ID,为简单起见,将其设为“abc123”。此会话 ID 作为 cookie 存储在客户端,并通过服务器端会话进行验证,以确保登录的用户在从一个网页移动到另一个网页时保持登录状态。如果 HTTP 不是无状态的,那么这个 cookie 当然不需要存在。因此,如果用户 B 窃取了用户 A 的 SID,并在他的计算机上创建了一个值为“abc123”的 cookie,那么他将成功劫持用户 A 的会话,但服务器根本无法合法地识别用户 B 的会话。请求与用户 A 的请求有任何不同,因此服务器没有理由拒绝任何请求。即使我们要列出服务器上已经处于活动状态的会话并尝试查看是否有人正在访问已经处于活动状态的会话,我们如何确定是另一个用户非法访问该会话而不是同一用户谁已经使用会话 ID 登录,但只是尝试用它发出另一个请求(即导航到不同的网页)。我们不能。检查用户代理?可以被欺骗 - 但作为纵深防御措施还是不错的。 IP地址?可以出于合法原因进行更改 - 但我建议检查 IP 的前两个八位字节之类的东西,而不是根本不检查 IP 地址,因为即使是数据计划网络上的用户出于完全合法的原因不断更改 IP通常只会更改其 IP 的最后两个八位字节。
总而言之,正是无状态 HTTP 谴责我们永远无法完全保护我们的网站免受会话劫持,但良好做法(如 Gumbo 提供的做法)足以防止绝大多数会话攻击.因此,试图通过拒绝同一 SID 的多个请求来保护会话不被劫持是非常可笑的,并且会破坏会话的全部目的。
【问题讨论】:
-
好吧!检查 IP 的前两个八位字节也无效。使用相同互联网服务的不同人可能具有相同的前两个八位位组,尽管他们总体上具有不同的 IP 地址。
-
前两个八位字节也可以合法地改变 - 例如在一个大型组织中,其中有多个通过不同 ISP 的互联网网关。