首页 > 解决方案 > 从任何浏览器中唯一识别计算机的挑战

问题描述

在一个 HTML5 Web 应用程序中,我正在构建一个依赖于客户端到客户端通信(使用推送器)的功能。它由服务器端的 PHP 和客户端的 Vue 组成。

典型的场景是:打开一个弹出窗口,并从那里直接与在同一台计算机上的任何其他浏览器中打开的其他一些窗口进行通信。假设您安装了 2 个浏览器,您使用 Firefox 打开 Web 应用程序弹出窗口,它与您之前在 Chrome 中打开的 Web 应用程序姊妹页面进行通信。

到目前为止,我们发现的唯一(半)方法是使用公共 IP 地址来构建一个以 IP 地址命名的私有通道……这是基本且有效的。

但是,如果有超过1台计算机连接到同一个路由器,它们都将共享同一个公共IP,这就是事情变得困难的地方!

一个解决方案可能是将计算机的本地 IP 添加到频道名称(已经使用公共 IP 构建),但是尽管我发现了一些很好的解决方法来从启动的 RTC 连接中获取此信息,但这看起来非常不可靠并且经常发生违反浏览器隐私规则……</p>

显然,我不能在服务器端使用 PHP 的会话信息,也不能在客户端使用 cookie/本地存储,因为所有这些解决方案都与浏览器本身紧密耦合(感谢上帝 Chrome 不会与 Firefox 共享其 cookie你的电脑)。如果我们使用 1 个单一浏览器,这些解决方案将是完美的(并且不需要推送器),但我们需要在同一台机器上处理多个浏览器。

这就是我想知道是否有人已经处理过这个设计挑战并分享了一些技巧,那会很棒!感谢您到目前为止的阅读!

标签: javascriptphphtmlip

解决方案


  • 您可以检查浏览器的用户代理。
  • 您可以检查来自不同浏览器的请求标头的组合。
  • 您可以在用户的​​浏览器中显式抛出和捕获错误,并将其发送到请求标头/正文中以确定他们正在使用的浏览器。
  • 您可以绘制画布以查看用户的 GPU/CPU 信息(因为您已经在使用 html5,这是一个好处)。
  • 您可以直接使用 webgl 对可能不同的指标做同样的事情(因为画布无论如何都使用 webgl)。
  • 您可以检查他们的打字速度,甚至建立他们的词汇和语言使用档案。
  • 如果您请求权限,您可以看到他们所有连接的媒体设备,例如耳机,即使只是请求音频权限也会显示所有这些设备。
  • 您可以使用诸如查找素数或加密密钥所需的时间来对他们的 CPU 进行基准测试。
  • 您可以使用几乎与您的声音一样独特的音频指纹识别,因为每个浏览器和 CPU 架构在数字模式和从音频创建的振荡方面略有不同,可以捕获。
  • 您可以检查他们的窗口大小和屏幕大小和屏幕分辨率。
  • 现在可能还有更多我没有想到的,您还可以结合使用它们中的任何一个来对设备进行指纹识别。

有关更多信息,请研究浏览器嗅探和数字指纹识别。更重要的是,您可以通过浏览器嗅探/数字指纹识别的组合,在同一台计算机上的自己的浏览器以及来自不同设备的不同用户中唯一地识别用户。

在您的特定情况下,您不能使用所有浏览器嗅探技术,但您仍然可以使用其中一些技术,例如用户代理,因为即使他们使用不同的浏览器,它仍会为您提供用户设备信息。

数字指纹的想法是你想要建立一个足够高的概率,你可以相当确定它是同一个用户,你永远不能真正确定,但足够确定。像屏幕尺寸这样的东西本身并没有多大意义,有数百万台设备在使用 1600 尺寸的屏幕,但请考虑以下假设示例:

  • 用户设备的屏幕尺寸为 1600,即约 1/8 个用户。
  • 用户的设备花了 20 毫秒来加密一个 4096 密钥,即 ~1/8 个用户。
  • 用户的设备用了 40 毫秒绘制了一个画布图像,即 1/8 个用户。

现在你已经有 8 * 8 * 8 = 1/512 的概率知道它是什么用户,并且基于 3 个根本无法识别的东西,这个价值会迅速上升。

然而,应该注意的是,使用任何浏览器嗅探或数字指纹技术如上述都属于隐私法规(至少在某些国家/地区)。像用户代理这样的很多东西都被弃用了,如果你在网站上做这样的事情,你会遇到像 GDPR 这样的事情的麻烦。我相信如果你明确地向用户征求他们的许可并让他们知道他们的浏览器正在被指纹识别,你就可以解决这个问题。但是你必须小心,因为如果它是恶意的,这样做会给你带来麻烦,在用户不知情的情况下做这样的事情是不道德的。


推荐阅读