在 PHP 中创建唯一用户指纹的方法
Posted
技术标签:
【中文标题】在 PHP 中创建唯一用户指纹的方法【英文标题】:Ways to create a unique user fingerprint in PHP 【发布时间】:2011-05-04 08:51:21 【问题描述】:在 php 中生成用户唯一性“指纹”的最佳方法是什么?
例如:
-
我可以使用用户的 IP 地址
然而,作为“指纹”,那里
可能是同一 IP 上的多个其他用户
我可以
使用用户的 IP + 用户代理作为
但是,“指纹”是单个用户
可以简单地从 safari 切换到
Firefox 并再次被视为独一无二的
理想情况下,指纹标记为“机器”而不是浏览器或“IP”,但我想不出这是如何实现的。
对于您如何唯一地识别您的用户,以及您的方法有哪些优势/劣势,欢迎提出想法/建议。
【问题讨论】:
这个网站几乎涵盖了您可以用来通过浏览器区分个人的所有信息。 panopticlick.eff.orgjavascript、Java 和 Flash 有很大帮助。 老问题,但是这个:md5(implode('',$_SERVER));
@Shea 有用的评论,但指纹不会改变(比喻地说),并且 $_SERVER 中会出现与用户无关的变化us1.php.net/reserved.variables.server
@Shea 我不会按原样使用您建议的技巧,因为指纹会在访问的每个网页上发生变化。但也许可以改进。
@Calimero 是的,你是对的。这很有用,但您需要过滤掉某些键。
【参考方案1】:
最简单和最好的方法:使用 phps session-management - 每个客户端都有一个 ID,存储在 cookie 中(如果启用)或作为每个链接和表单上的 get-variable 给出(或者你可以在你的自己的)。但是,这只会对浏览器进行“指纹识别”——如果用户更改了他的浏览器、删除了他的 cookie 或其他任何东西,你就无法再识别它了。
通过 IP 地址识别每个客户端通常是个坏主意,而且不会奏效。使用相同路由器的客户端将拥有相同的 IP 地址 - 通过代理池连接的客户端在每次页面加载时可能拥有另一个 IP 地址。
如果您需要客户端无法轻松操作的解决方案,请尝试结合使用客户端浏览器支持的所有内容,并在每次页面加载时进行比较:
“正常”HTTP Cookies 本地共享对象(Flash Cookie) 使用 html5 Canvas 标签将 cookie 存储在自动生成、强制缓存的 PNG 的 RGB 值中,以读取像素(cookie) 在网络历史记录中存储和读取 cookie 在 HTTP ETag 中存储 cookie Internet Explorer 用户数据存储 HTML5 会话存储 HTML5 本地存储 HTML5 全局存储 通过 SQLite 的 HTML5 数据库存储有一个名为evercookie 的解决方案可以实现所有这些。
【讨论】:
您链接到 PHP 手册的德语翻译...这里是同一页的英文:php.net/manual/en/book.session.php -- 此外,使用 Evercookie 或任何其他在客户端上存储数据的方式在大多数国家/地区,难以删除的明确目的可能是非法的。【参考方案2】:无法保证达到 100% 的可靠性,但结合一些常用方法可以为您带来有意义的结果
用户一般不会切换浏览器。仅仅为了达到工程完美而在算法中过度复杂化是不值得的。 如果您可以预期多个用户来自同一个 IP,那么您肯定属于前 100 个网站。不要把它看成个人的,但你就是不那么受欢迎。如果有必要,请采取可行的最简单路线并随着时间的推移进行调整。
【讨论】:
我完全不同意您的第二点 - 取决于他拥有的网站类型,您将很快获得具有相同 IP 的多个用户。假设他的网站是一个浏览器游戏:所有的学生互相告诉,朋友们一起玩,在信息学课上,他们有互联网,他们都在学校网络上玩这个游戏(这意味着:相同的 IP,但是开发人员必须确定它是否是同一台电脑才能知道这不是作弊的多帐户) @oezi 这样的浏览器游戏可以很好地处理会话 ID。 确实,我只是想举例说明为什么即使在小型网站上也不能依赖 IP 地址。 是的,我希望我的网站很受欢迎。话虽如此,我在一个小型 VPS(80Mb RAM - 是的!)上运行的小型网络应用程序 - 所以它不需要太多过载。我需要确保每个用户的公平使用。 @So Over It:资源如此之少,我会专注于我的应用程序的核心,而不是以后可以添加的具体细节。【参考方案3】:还有其他需要考虑的因素,用户的公共 IP 地址在每次页面加载时也会发生变化。 有多个组织在其路由器中切换公共 IP 以平衡流量。
【讨论】:
【参考方案4】:我有三台不同的计算机、各种手持设备,其中许多都安装了不同的浏览器。我在家里交替使用所有这些,把它们带到其他地方,基本上,在各种 IP 地址上。我想指出的是,如果您的目标是阻止某人,那么对浏览器或机器进行指纹识别永远不会是万无一失的。
我建议您采用不同的方法。根据您提供的暗示您被禁止用户身份的不确定信息进行判断(相同 IP 或相同用户代理,如果它是不常见的,或者一些 javascript 浏览器指纹识别方法,例如可用字体、可用插件、非标准窗口大小等),并要求那些可疑访问者进行某种更高形式的身份验证——例如使用 Facebook、Google+ 或 Twitter 的 oauth。然后,您可以查看该社交媒体帐户是真实的还是只是为了规避而创建的。还有电话验证 API,以防您的用户群不熟悉社交媒体,并且取决于用户不规避禁令对您的价值。
【讨论】:
以上是关于在 PHP 中创建唯一用户指纹的方法的主要内容,如果未能解决你的问题,请参考以下文章