会话劫持
所以我有一个小问题。我正在尝试识别一个访问者,如果这个问题中提到的$ _SERVER变量不是不可能的话,这非常困难:Preventing session hijacking。
可能的解决方案
要比将客户端A中的cookie复制到客户端B(这可悲的是儿童游戏)更难,我想收集一些信息并根据我存储的内容对其进行验证。在我的数据库中,我想存储用户代理,IP地址,操作系统等内容。我将使用MCRYPT和存储进行加密。为了与用户匹配,必须设置许多变量,这使得它比仅仅将cookie内容复制到登录更困难。
问题
这是我的问题开始的时候......用户代理和操作系统几乎完全相同。原因是胖客户端具有相同的可启动映像。另一个问题是IP。数据中心中的服务器与办公室有连接。对于我们的应用程序(即使不能从外部访问),每个客户端的IP地址都是相同的。我发现我可以尝试使用X-Forwarded-For标头来区分IP地址,从而使用户更加独特。
下一步是什么?
我想知道的是:如何确保X-Forwarded-For始终设置而无需客户端访问的任何内容?是否必须通过路由添加某些内容?我们的连接是https,所以我怀疑我可以“注入”一些东西。接下来,如果我可以注入这样的东西,用户客户端可以这样做吗?
客户端位于我们的内部办公网络中,无法从外部访问应用程序(在php中运行)
答案 0 :(得分:3)
X-Forwarded-For
和User-Agent
HTTP标头很容易被任何用户欺骗(就像将Cookie从一台计算机复制到另一台计算机一样容易)。
可以在客户端上使用Header Hacker等Chrome扩展程序,并且由于您的网站使用HTTPS,因此无法在途中添加这些标头(因为标头需要添加到OSI应用程序层,而不是传输层)。
如果您担心用户在彼此之间复制cookie,是否有任何机制可以阻止他们共享用户名和密码凭据?如果您确实设法实现了一些可以验证其会话保留在同一客户端计算机上的内容,那么他们是否可以通过相互登录来解决它?
除了我的问题,对于解决方案,您可以在本地网络中引入本地代理,纯粹是为了连接到数据中心的站点。站点应拒绝任何非来自代理服务器IP的连接(将Web服务器或防火墙配置为仅接受用于Web连接的代理的客户端IP)。使用此方法,您需要在代理上安装SSL证书,每个客户端计算机都可以信任该证书。这将使代理服务器能够解密流量,添加适当的IP地址头(覆盖客户端的任何设置),然后将其转发到您的服务器上。然后,服务器代码可以安全地检查X-Forwarded-For
标头,以确保每个用户会话保持不变。
如果这听起来像是一个很好的解决方案,如果您有任何疑问,请发表评论,我会更新我的答案。
另外两个想法:
session_regenerate_id()
随机重新生成会话。这将更新创建请求的客户端的会话ID,然后将注销使用相同ID的任何其他客户端,因为它们正在发送旧会话ID。实际上,您可以在每个请求上执行此操作,这将确保只有当前客户端正在使用当前会话。