PHP中创建独特用户指纹的方法

35

什么是在 PHP 中生成用户唯一性“指纹”的最佳方式?

例如:

  1. 我可以使用用户的 IP 地址作为“指纹”,但是在同一IP上可能会有多个其他用户
  2. 我可以使用用户的 IP + 用户代理作为“指纹”,但是单个用户可以简单地从Safari切换到Firefox,再次被视为唯一

理想情况下,“指纹”应标记“机器”,而不是浏览器或“IP”,但我想不出如何实现这一点。

欢迎提出您独特识别用户的方法/建议,并介绍您的方法的优缺点。


这个网站涵盖了几乎所有你可以通过浏览器来区分个人的信息。 https://panopticlick.eff.org/ JavaScript、Java和Flash有很大帮助。 - JAL
2
老问题,但是这个: md5(implode('',$_SERVER)); - Shea
2
@Shea 很有帮助的评论,但指纹不会改变(比喻),而且$_SERVER中与用户无关的变量会有所变化。http://us1.php.net/reserved.variables.server - PJ Brunet
3
@Shea,我不会直接使用你所建议的技巧,因为在访问每个网页时指纹都会发生变化。但也许可以加以改进。 - Calimero
1
@Calimero 是的,你说得对。它很有用,但你需要过滤掉某些键。 - Shea
4个回答

10
最简单和最好的方法:使用php的session-management——每个客户端都会被分配一个ID,存储在cookie中(如果启用),或作为每个链接和表单的get变量(或者您可以自己设置cookie)。但是,这只是“指纹”浏览器——如果用户更改浏览器、删除cookie或其他操作,您将无法再识别它。

通过IP地址识别每个客户端通常是不可行的,而且不起作用。使用相同路由器的客户端将具有相同的IP地址——通过代理池连接的客户端可能会在每个页面加载时具有另一个IP地址。

如果您需要一种无法轻易被客户端操纵的解决方案,请尝试结合以下所有支持客户端浏览器的内容,并在每次页面加载时进行比较:

  • “普通”的HTTP Cookie
  • 本地共享对象(Flash Cookie)
  • 使用HTML5 Canvas标记将cookie存储在自动生成的强制缓存PNG的RGB值中以读取像素(cookie)
  • 在Web History中存储cookie并读取cookie
  • 在HTTP ETags中存储cookie
  • Internet Explorer userData存储
  • HTML5 Session Storage
  • HTML5 Local Storage
  • HTML5 Global Storage
  • 通过SQLite进行HTML5数据库存储

有一种解决方案叫做evercookie,它实现了所有这些内容。


2
你链接到了PHP手册的德语翻译... 这里是同样的页面的英语版: http://www.php.net/manual/en/book.session.php -- 此外,在大多数国家,使用Evercookie或任何其他用于在客户端存储数据并明确目的是为了使其难以删除的方式可能是非法的。 - Adrian Schmidt

5

还有一件事情需要考虑,用户的公共IP地址也可能在每次页面加载时发生变化。
有多个组织将公共IP在路由器中切换以平衡流量。


3
实现100%的可靠性并不是一定保证的,但是结合一些常见的方法可以给你有意义的结果。
  • 用户通常不会更改浏览器。过度复杂化算法只为达到工程完美并不值得付出努力。
  • 如果您可以预期来自同一IP的多个用户,则肯定属于前100个网站。不要太在意,但您并不那么受欢迎。
采取最简单可能的路线,并在需要时进行调整。

19
我完全不同意你的第二点观点——根据他的网站类型,你很快就会得到多个具有相同IP的用户。比如他的网站是一个浏览器游戏:所有的学生互相告诉对方,朋友们一起玩,而在计算机课上,他们在学校网络上都在玩这个游戏(这意味着相同的IP,但开发者必须找出是否是同一台电脑,以确定这不是作弊的多账户)。 - oezi
@oezi 这样的浏览器游戏可以很好地与会话 ID 配合使用。 - pestaa
3
确实,我只是想举个例子,说明即使在小型网站上也不能仅依赖IP地址。 - oezi
1
是的,我希望我的网站受欢迎。话虽如此,我所拥有的小型Web应用程序运行在一个微型VPS上(只有80MB的RAM - 是的!),因此不需要太多负载即可超载。我需要确保每个用户都能公平使用。 - So Over It
@So Over It:由于资源非常有限,我会集中精力开发我的应用程序核心,而不是那些可以稍后添加的细节。 - pestaa
@oezi 是的,你说得对,任何带有内部网络的“电脑房”- 办公楼、学校、医院、商场(为顾客提供免费Wi-Fi)...... - jave.web

0

我有三台不同的电脑,各种手持设备,并且它们中的许多都安装了不同的浏览器。我在家里交替使用它们并带到其他地方,所以基本上是在不同的IP地址下使用。我的意思是,如果你的目标是阻止一个人,那么对浏览器或机器进行指纹识别永远不会是绝对可靠的。

我建议你采取不同的方法。根据你可用的不确定信息来判断被禁用户的身份(相同的IP或相同的用户代理,如果它是不常见的,否则一些JavaScript浏览器指纹识别方法,如可用字体、可用插件、非标准窗口大小等),并要求这些可疑访问者提供更高级别的身份验证 - 例如使用Facebook、Google+或Twitter的OAuth。然后,您可以查看该社交媒体帐户是否真实或仅为规避而创建。如果您的用户群体不熟悉社交媒体,还有电话验证API可用,具体取决于您的用户不规避封禁的价值程度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接