防止会话劫持的最佳方法是什么?

时间:2020-03-05 18:42:08  来源:igfitidea点击:

具体来说,这与何时使用客户端会话cookie来标识服务器上的会话有关。

在整个网站上使用SSL / HTTPS加密是最好的答案,并且我们最大程度地保证没有中间人会嗅探现有的客户端会话Cookie?

在存储在会话Cookie中的会话值本身上使用某种加密的方法可能不是第二好方法吗?

如果恶意用户对计算机具有物理访问权限,他们仍然可以查看文件系统以检索有效的会话cookie,并使用该cookie劫持会话?

解决方案

回答

为了降低风险,我们还可以将原始IP与会话相关联。这样,攻击者必须在同一专用网络中才能使用会话。

检查引荐标头也可以是一种选择,但是更容易被欺骗。

回答

加密会话值将产生零影响。会话cookie已经是一个任意值,对其进行加密只会生成另一个可以嗅探的任意值。

唯一真正的解决方案是HTTPS。如果我们不想在整个站点上都使用SSL(也许我们有性能方面的顾虑),则可能仅使用SSL保护敏感区域就可以摆脱困境。为此,请首先确保登录页面为HTTPS。当用户登录时,除了常规会话cookie外,还设置一个安全cookie(这意味着浏览器将仅通过SSL链接传输它)。然后,当用户访问"敏感"区域之一时,将其重定向到HTTPS,并检查该安全cookie的存在。真正的用户会拥有它,会话劫持者则不会。

编辑:这个答案最初是在2008年写的。现在是2016年,没有理由不在整个站点上使用SSL。不再需要纯文本HTTP!

回答

SSL仅有助于嗅探攻击。如果攻击者可以访问计算机,我将假定他们也可以复制安全cookie。

至少,请确保旧的Cookie会在一段时间后失去其价值。当cookie停止工作时,即使是成功的hijaking攻击也将受到挫败。如果用户从一个多月前登录的会话中获得Cookie,请重新输入密码。确保每当用户单击我们站点的"注销"链接时,就永远不能再次使用旧的会话UUID。

我不确定这种想法是否行得通,但是可以解决:将一个序列号添加到会话cookie中,也许是一个像这样的字符串:

SessionUUID,序列号,当前日期/时间

对该字符串进行加密并将其用作会话cookie。定期更改序列号,可能是在Cookie的使用时间为5分钟之前,然后重新发出该cookie。如果愿意,我们甚至可以在每个页面视图上重新发布它。在服务器端,保留我们为该会话发出的最后一个序列号的记录。如果有人发送了序列号错误的cookie,则意味着攻击者可能正在使用他们较早拦截的cookie,因此使会话UUID无效并要求用户重新输入密码,然后重新发出新的cookie。

请记住,用户可能有多台计算机,因此他们可能有多于一个活动会话。不要执行强迫他们每次在计算机之间切换时再次登录的操作。

回答

确保我们不对会话ID使用递增整数。使用GUID或者其他长时间随机生成的字符串会更好。

回答

尝试使用Liu,Kovacs,Huang和Gouda在本文中描述的Secure Cookie协议:

如文件中所述:

A secure
  cookie protocol that runs between a client and a server
  needs to provide the following four services: authentication, confidentiality, integrity and anti-replay.

至于易于部署:

In terms of efficiency, our protocol does not involve any database
  lookup or public key cryptography. In terms of deployability, our protocol can be easily deployed on an existing web server, and it does not require any change to
  the Internet cookie specication.

简而言之:它安全,轻便,对我来说很棒。