如何防止多个客户端使用相同的会话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的多个请求来保护会话免受劫持是荒唐的,并且将打败会话的全部目的。