33

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

例如:

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

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

对您如何唯一识别用户以及您的方法有哪些优点/缺点的想法/建议持开放态度。

4

4 回答 4

10

最简单和最好的方法:使用 phps会话管理- 每个客户端都有一个 ID,存储在 cookie 中(如果启用)或作为每个链接和表单的 get-variable 给出(或者你可以自己设置一个 cookie)。但是,这只会对浏览器进行“指纹识别”——如果用户更改了浏览器、删除了 cookie 或其他任何内容,您将无法再识别它。

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

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

  • “正常”HTTP Cookie
  • 本地共享对象(Flash Cookie)
  • 使用 HTML5 Canvas 标签将 cookie 存储在自动生成、强制缓存的 PNG 的 RGB 值中以读取像素(cookie)
  • 在网络历史记录中存储和读取 cookie
  • 在 HTTP ETag 中存储 cookie
  • Internet Explorer 用户数据存储
  • HTML5 会话存储
  • HTML5 本地存储
  • HTML5 全局存储
  • 通过 SQLite 进行 HTML5 数据库存储

有一个名为evercookie的解决方案可以实现所有这些。

于 2010-11-03T08:39:53.557 回答
5

还有其他需要考虑的因素,用户的公共 IP 地址在每次页面加载时也会发生变化。
有多个组织在他们的路由器中切换公共 IP 以平衡流量。

于 2011-12-12T16:27:45.217 回答
3

无法保证实现 100% 的可靠性,但结合一些常用方法可以为您提供有意义的结果

  • 用户一般不会切换浏览器。仅仅为了达到工程完美而过度复杂的算法是不值得的。
  • 如果您可以预期多个用户来自同一个 IP,那么您肯定属于前 100 个网站。不要把它看成个人的,但你只是不那么受欢迎。

采取最简单的可行路线,如果有必要,可以随着时间的推移进行调整。

于 2010-11-03T08:39:58.230 回答
0

我有三台不同的计算机,各种手持设备,其中许多都安装了不同的浏览器。我在家里交替使用所有这些,把它们带到其他地方,基本上,在各种 IP 地址上。我要指出的是,如果您的目标是阻止某人,那么为浏览器或机器指纹识别永远不会是万无一失的。

我建议你采取不同的方法。根据您提供的暗示您被禁止用户身份的不确定信息进行判断(相同 IP 或相同用户代理,如果它是不常见的,或者一些 javascript 浏览器指纹识别方法,例如可用字体、可用插件、非标准窗口大小等),并要求那些可疑访问者进行某种更高形式的身份验证——例如使用 Facebook、Google+ 或 Twitter 的 oauth。然后,您可以查看该社交媒体帐户是真实的还是只是为了规避而创建的。如果您的用户群不熟悉社交媒体,并且取决于用户不规避禁令对您的价值,还有电话验证 API。

于 2017-03-11T12:00:32.700 回答