【问题标题】:Challenge to uniquely identify a computer from any of its browsers从任何浏览器中唯一识别计算机的挑战
【发布时间】:2021-12-17 06:10:59
【问题描述】:

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

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

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

但是,如果有超过 1 台计算机连接到同一个路由器,那么它们都将共享同一个公共 IP,这就是问题所在!

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

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

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

【问题讨论】:

  • thank God Chrome won't share its cookies with Firefox on your computer - 我想你在这里回答你自己的问题。浏览器独立运行是有充分理由的。作为服务器,您所拥有的只是浏览器发送的内容,并且鉴于所有内容都可以由用户控制,因此它并不完全可靠。最终,我想我会问; 为什么你不能使用会话?要求每个浏览器登录,并使用用户名/等在服务器端将会话绑定在一起。我经常使用两个浏览器因为我想要单独的会话。任何可以绕过的东西都会让我担心。
  • 只是为了排除它......有什么理由不通过网络服务器使用 websockets?你在做什么特别需要点对点连接?
  • Server Sessions 与 Chrome / Firefox 无关,因此如果您希望 Chrome / Firefox 被视为一台主机。一个想法是,在您的第一个浏览器中,您为用户提供了生成服务器端的唯一参考,让他们能够保存他们可以下载的某种密钥文件,从第二个浏览器为用户提供加载密钥文件的选项。密钥文件可能具有某种加密/ShaSum,因此无法劫持会话。如果您使用 SessionStorage 而不是 LocalStorage 会更好,您可以将来自多个选项卡/浏览器的多个窗口视为单独或连接的主机。
  • 这背后的想法是为支持团队提供一种解决方案,以便在客户共享屏幕时自动隐藏私人/敏感数据。它工作得很好,但如果我们不能将此行为限制在单个最终用户计算机上,它将隐藏其他用户的数据......
  • 好吧,为什么他们需要属于同一台计算机?为什么不让它们属于同一个用户?

标签: javascript php html ip


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

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

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

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

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

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

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

【讨论】:

  • 非常感谢@Matriarx 提供的大量提示,你明白了!即使我们不能 100% 准确,但获得一个很好的概率使事情正常运行通常足以涵盖相当高比例的用例。
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2013-03-10
  • 1970-01-01
  • 2022-11-20
  • 2020-08-12
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
相关资源
最近更新 更多