数字“指纹”收集

数字“指纹”收集是指在用户回访您的网站时尝试识别其身份,或者跨不同网站识别同一用户。 您的设置与他人的设置之间在许多方面可能有所不同。例如,您可能使用的是其他类型的设备 且屏幕尺寸不同,且安装的字体也不同。如果我的字体是“Dejavu Sans” 但您没有安装,则任何网站都可以通过检查该字体来辨别您与我之间的区别。就是这样 数字“指纹”收集的工作原理;您可以构建这些数据点的集合,并且每个集合都提供更多方式来区分用户。

更正式的定义可能如下:数字“指纹”收集是指使用明显和不明显的长期存在时间的操作 用户设置的某些特征,以尝试将其与尽可能多的其他用户区分开来。

在某些极端情况下,对用户进行数字“指纹”收集很重要,例如欺诈检测。但数字“指纹”收集 用于跨网站跟踪用户,并且跟踪通常是在未经用户同意的情况下完成,或者在某些情况下根据 未充分告知用户的无效同意声明。完成上述操作后,这些用户通常就会发现 不安心,感觉有些被背叛。

数字“指纹”收集是指设法隐蔽地将一位用户与其他用户区分开来。数字“指纹”收集可用于识别 但仍然是同一网站上的同一用户,或同时在两个不同的浏览器个人资料中识别同一用户。 也就是说,数字“指纹”收集可用于跨网站跟踪用户。确定性、明显的跟踪方法, (例如存储具有用户专属 ID 的 Cookie)在某种程度上可能被用户观察到并受其控制 (上一单元介绍了其中一些方法)。但数字“指纹”收集更难准确避免 因为它是隐秘的但这种行为依赖于不断变化的特征,而且很可能在无形之中发生。正因如此, “fingerprinting”。更改指纹是一件非常困难的事,无论是数字指纹还是指纹的末端,

浏览器供应商知道用户不喜欢被跟踪,因此他们不断实施相关功能来限制数字“指纹”收集 (部分内容我们已在上一单元中介绍过)。接下来,我们来看看这些功能可能会给您的业务带来哪些影响 要求以及如何以保护隐私的方式去做想做的事情。这更详细地介绍了浏览器保护功能 数字“指纹”收集会影响您执行的操作和方式,而不影响您执行数字“指纹”收集的方式。

实际上,大多数开发者和大多数企业都不需要对用户进行指纹识别。如果您的应用需要用户登录 那么您的用户向您标识自己,同时获得他们的同意,并且他们可以单方面选择停用 选择最合适的广告素材这是一种有助于了解哪些用户登录的隐私保护方法。您的应用可能不会 这样可更好地保护用户(然后收集 只获取您需要的数据)。

正确做法

评估您的第三方以进行数字“指纹”收集。在第三方单元中,您需要 可能已经列出了您要包含的任何第三方服务及其发出的网络请求。有可能 检查这些请求,了解哪些数据会传回给发起者(如果有)。不过,这通常很难实现。 数字“指纹”收集本质上是一种隐蔽的过程,涉及请求不受用户批准的数据。

此外,还应该阅读第三方服务和依赖项的隐私权政策,看看是否有数字“指纹”收集迹象 使用中。它有时称为“概率匹配”,或者是一系列概率匹配技术的一部分, 这与“确定性匹配”相对。

数字“指纹”收集的工作原理

您个人的上述所有属性组合常常对您来说独一无二,或 至少面向一小部分类似用户发布以便暗中跟踪您。

延伸阅读:被动和主动数字“指纹”收集

这里需要对被动数字“指纹”收集技术和主动数字“指纹”收集技术加以区分。被动数字“指纹”收集 技术是指默认使用提供给网站的信息主动式数字“指纹”收集技术 明确地请求浏览器以获取额外信息。这种区别之所以重要的原因在于 可以尝试检测、拦截或缓解主动技术。API 可能会受到限制,或者需要通过对话框进行网关控制 请求用户许可(从而提醒用户正在使用这些权限,或允许用户拒绝这些权限) 定义)被动技术是指使用已提供给网站的数据,通常是因为从以往来看, 在信息超级高速公路刚刚兴起的时代,这些信息已提供给所有网站。用户代理字符串是 这是一个示例,稍后我们会对此进行更详细的说明。它被认为非常有用,能够为我们提供 浏览器、版本和操作系统的 相关信息,这样网站就可以选择 并据此进行改进不过,这也增加了可辨识出的大量信息 以便区分不同的用户因此,此类信息越来越不再可用,或者至少是冻结的。 使其不再具有辨识度。如果您所做的操作依赖于此信息 - 例如,如果您采取不同的 代码分支,那么此代码可能会由于浏览器日益冻结或停止该信息而遭到破坏。 这种情况下,测试是最好的防御措施(稍后见)。

延伸阅读:衡量可指纹性

用来衡量每个数据点所提供信息量的技术衡量指标称为,以比特为单位。 一个具有许多不同可能值的功能(例如已安装的字体列表)可能会贡献很多位 因此,如果某些东西没有太多的辨识能力(如您使用的操作系统),则可能只会增加 一些。HTTP 年历介绍了现有的数字“指纹”收集方法 库自动执行这一过程,将来自许多不同 API 的响应组合成一个“哈希”,这可能仅标识一个 用户,甚至是一个用户。Maud Nalpas 在 这段 YouTube 视频,但简而言之,假设您在看到 好友列表,其中包括他们最喜欢的音乐、最喜欢的食物和他们所使用的语言...但还添加了他们的名字 已移除。任何一个人的列表都很有可能可在您的朋友中唯一地标识他们,或者至少可以缩小范围。 只有少数几个人可以参与进来这就是数字“指纹”收集的工作原理:系统会将您喜欢的内容列表变成“哈希”。包含 从而更轻松地在两个未连接的不同网站上将用户识别为同一人, 跟踪:规避用户对隐私的期望。

浏览器如何应对数字“指纹”收集?

重要的是,浏览器供应商很清楚网站(或网站中包含的第三方)的多种不同方式 计算用户的可辨别指纹,或为影响唯一性的不同信息位计算 该指纹的特征。其中一些方式是明确的、刻意的,例如浏览器的用户代理字符串,通常 会识别浏览器、操作系统和使用的版本(如果您并 我使用的是其他浏览器)。有些方式并非刻意设计为支持指纹功能,但最终却是这样 如字体列表,或可供浏览器使用的视频和音频设备。(浏览器不必使用 这些设备,只需按名称获取列表即可)。而有些人则是指纹的促成者。 例如,以精确像素的方式呈现画布元素上字体的抗锯齿功能。 还有很多,而且您的浏览器与我的不同,浏览器都会增加熵,因而有可能增加 以便区分您与我之间的差别,并尽可能地识别个人在不同网站上的独特性。 https://amiunique.org 列出了很多容易造成指纹问题(但绝对不详尽)的列表 而且这一名单一直在不断增加(因为人们对于能够指纹识别用户的收益颇为丰厚),即使用户 您绝不想要该模式,或者可能并不希望执行这项操作)。

不支持某些强大的 API

浏览器供应商对所有这些计算用户指纹的方法做出了反应,那就是想方设法降低 这些 API 提供的熵的大小。但最严格的方法是不从一开始就实现。 一些主流浏览器已针对各种硬件和设备 API(例如从 NFC 和蓝牙访问 客户端 Web 应用)。这 显而易见, 可能会影响您的应用和服务:在没有实现某个 API 的浏览器里,您完全无法使用它, 限制或完全切断我们考虑某些硬件方法。

用户权限网关

浏览器供应商采取的第二种方法是在没有某种明确的用户许可的情况下阻止 API 或数据访问。 采用这种方法通常也是出于安全考虑 - 网站应该不能使用您的摄像头拍照 会在未经你许可的情况下使用!但在这方面,隐私权和安全可能会有相似的兴趣。识别用户所在位置 的确会侵犯隐私权,但也会影响指纹的唯一性。需要权限 查看地理定位并不会减少某个位置增加该指纹唯一性的额外熵, 从根本上消除了使用地理定位进行数字“指纹”收集的情况,因为不再是隐形中进行的。课程要点 数字“指纹”收集是为了在后台区分用户。如果您已做好准备,让用户知道 如果您尝试识别它们,则不需要使用数字“指纹”收集技术:让用户创建账号并登录 。

增加不可预测性

在某些情况下,浏览器供应商会采取第三种方法降低 API 的响应精细程度 因此识别性较低数据模块中对此进行了说明,作为随机响应机制的一部分, ,以避免无意中收集可用于识别个人身份的数据。浏览器供应商 也可以采用此方法来处理提供给 Web 应用和第三方的 API 数据。例如, 用于衡量网页性能的非常准确的计时 API 来自window.performance.now()。浏览器知道这些值 精确到微秒,但返回的值通过四舍五入到最接近的 20 微秒来刻意降低精度 来避免将其用于数字“指纹”收集(不可否认,这也是为了确保安全,避免计时攻击)。这里的目标是 以确保 API 仍然有用,但会降低回答的识别性:实质上是为了提供“群体免疫”使之 您的设备看起来更像别人的设备,而不是您。Safari 简化了系统配置

强制执行隐私预算

隐私预算是一项提案,建议浏览器估算每个数字“指纹”收集表面显露的信息。 此功能尚未在浏览器中实现。目的是在保护用户隐私的同时支持功能强大的 API。详细了解隐私预算提案

使用广泛的测试环境

所有这些都会影响您构建应用和服务的方式。具体而言,应对措施和方法 。这意味着,在多个不同环境中测试您的工作至关重要。 这当然很重要,但可以合理地假设 HTML 呈现或 CSS 对于 而不管该引擎是在哪个浏览器或平台上(因此,您可能会倾向于只在一个浏览器或平台上进行测试) 例如,基于 Blink 的浏览器)。显然,API 的用法并非如此,因为共享 在强化 API 表面防范数字“指纹”收集的方式方面,呈现引擎的差异可能很大。

正确做法

  • 查看您自己的分析数据和受众群体,据此在测试时应优先考虑哪些浏览器。
  • 一组适合测试的浏览器包括:Firefox、Chrome、Edge、桌面版 Safari、Chrome 和 Android 版 Samsung Internet。 和 iOS 版 Safari这样可以确保您在三大主要渲染引擎(Firefox 中的 Gecko、Blink 的各种分支)中进行测试 Chrome、Edge 和 Samsung Internet 以及 Safari 中的 Webkit)。
  • 如果您的网站还可能会在不太常见的设备(例如平板电脑、智能手表或游戏机)上使用,也请在这些设备上进行测试。 某些硬件平台在浏览器更新方面可能落后于移动设备和桌面设备,这意味着某些 API 可能未实现或 而不能在这些平台上的浏览器中使用。
  • 使用一个或多个以保护用户隐私为动机的浏览器进行测试。包括即将推出的预发布和测试版本 Safari 的技术预览版、 Chrome 的 Canary 版、Firefox 的 Beta 渠道。 这有助于您及时发现 API 中断情况以及对您网站造成影响的更改,避免这些更改影响到您的网站 。同样,为用户环境和环境。如果您的 用户群中拥有大量旧版 Android 手机,请务必在测试中纳入这些手机。大多数人都没有 快速的硬件和最新版本。
  • 使用干净的个人资料并在无痕/无痕浏览模式下进行测试;您已同意 个人资料中所需的权限。测试如果您针对任何问题拒绝向该网站授予权限,会发生什么情况。
  • 在 Firefox 的指纹保护中明确测试您的网页 模式。这样一来,如果您的网页尝试进行数字“指纹”收集,则会显示权限对话框;对于某些 API,系统会返回模糊不清的数据。 这有助于您确认服务中包含的第三方是否在使用可指纹识别的数据,或者您自己的服务是否依赖于您所提供的服务 然后,您可以考虑故意模糊测试是否会使执行您所需的操作变得更加困难。建议将 进行相应更正,以便从其他来源获取相应数据,不使用这些数据,或使用不太精细的数据。
  • 如前面的“第三方”单元中所述,审核第三方 以了解其是否使用了数字“指纹”收集技术。被动数字“指纹”收集难以检测(并且 否则,数字“指纹”收集模式可能会标记一些数字“指纹”收集技术, 并寻找 navigator.userAgent 的用途或意外创建的 <canvas> 对象也可能会揭示一些方法 需要进一步审查。另外还需要考虑使用“概率匹配”一词或 用于描述第三方的技术材料;但有时可能表明使用了数字“指纹”收集技术。

跨浏览器测试工具

出于隐私保护目的测试代码的过程很困难,手动测试时需要注意的事项如上文所述。 例如,如果您拒绝向网站授予其尝试访问的任何 API 的权限,会发生什么情况?如何呈现给用户? 自动化测试无法判断网站的行为是帮助用户信任它,还是反过来鼓励用户不信任它。 或者认为有东西被隐藏起来了。

然而,在网站经过审核后,我们会对 API 进行测试,以确认较新版本(或 即将推出的“Beta 版”和“预览版”可以自动执行,而且在很大程度上应该作为现有测试套件的一部分。问题 使用自动化测试工具时,需要考虑的一点是: 控制可用的 API 和功能。Chrome 通过命令行开关执行此操作, 和 Firefox 一样,并且可在测试工具中访问这些元素 设置可让您在启用或停用 API 的情况下运行某些测试。(例如,Cypress 的 browser-launch 插件 nd puppeteer 的 launch.args 参数 以在启动时添加浏览器标志。)

仅通过用户代理字符串获取粗略信息

再举一个例子,自网络初期以来,浏览器在 HTTP 用户代理标头。几乎长久以来,人们都在教网络开发者不要使用用户代理标头的内容 向不同的浏览器提供不同的内容 但一直以来,网络开发者都是这样做的 在某些(但不是所有)情况下提供正当理由。我们不希望网站因提供次优体验而被挑出浏览器, 这会导致每个浏览器都冒充其他任何浏览器,并且用户代理字符串如下所示:

Mozilla/5.0 (Linux; Android 6.0.1; SGP771 Build/32.2.A.0.253; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36

其中之一便是 Mozilla/5.0,这款浏览器与第一批宇航员一同发布 20 多年前在国际空间站上加装了空间用户代理字符串是指纹采集的丰富熵源, 当然,为了减少可指纹识别问题,浏览器制造商要么已经冻结了用户代理标头,要么正在 这样做。这是另一个无需彻底移除 API 即可更改 API 提供的数据的示例。 发送空白的用户代理标头会破坏无数网站,因为这些网站都已经存在。一般来说,浏览器会进行哪些操作 移除其中的一些细节 然后保持大部分细节不变(您可以在 SafariChrome、 和 Firefox)。这种保护措施 详细数字“指纹”收集实质上意味着,您再也不能相信用户代理标头是准确的, 那么一定要找到替代数据源

需要明确的是,用户代理中的数据并不会完全消失,而是以较低的粒度提供,或者 有时不准确,因为报告了较旧但始终不变的数字。例如,Firefox、Safari 和 Chrome 浏览器 将报告的 macOS 版本号更改为 10(请参阅关于缩减用户代理字符串的更新 进行详细讨论)。如需详细了解 Chrome 计划如何减少用户代理字符串中的数据,请参阅用户代理缩减 但简而言之,您可以预料到,报告的浏览器版本号只包含一个主要版本(因此版本号 如 123.0.0.0(即使浏览器版本为 123.10.45.108),但操作系统版本不会显示详细信息, 冻结到少数不变的选项之一。因此,一个虚拟的 Chrome 版本 123.45.67.89 运行在虚拟的 “Windows 20”会将其版本号报告为:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36

您所需的核心信息(浏览器版本)仍然可用:这是 Windows 版 Chrome 123。但其子公司 信息(芯片架构、哪个 Windows 版本、所模仿的 Safari 的版本、浏览器的次要版本) 冻结后将不再可用。

将此与“当前”其他平台上的 Chrome 用户代理:

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36

可以看到,唯一不同的是 Chrome 版本号 (104) 和平台标识符。

同样,Safari 的用户代理字符串会显示平台和 Safari 版本号,还会给出 iOS 操作系统版本, 但其他一切都被冻结因此,在虚构的 macOS 20 上运行的 Safari 1234.5.67 版本可能将其用户代理列为以下形式:

Mozilla/5.0 (Macintosh; **Intel Mac OS X 10_20_0**) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15

在虚构的 iOS 20 中,可能为:

Mozilla/5.0 (iPhone; CPU **iPhone OS 20_0** like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/**20.0 Mobile/15E148 Safari/605.1.15**

同样,我们同样提供了核心信息(在 iOS 或 macOS 上为 Safari),iOS Safari 仍然会提供 iOS 版本号; 但过去提供的许多辅助信息现在都被冻结了。重要的是,这其中包括 版本号,该版本号不一定可用

针对所举报用户代理的更改引发热议。https://github.com/WICG/ua-client-hints#use-cases summarymarises 一些论点和更改原因,Rowan Merewood 提供了幻灯片 在进一步解释的 UA 客户端提示提案的背景下,提供了一些关于停止使用用户代理进行区分的策略。

模糊测试

模糊测试是安全实践的一个术语,采用非预期值调用 API,并希望它们能处理 意外的值无效,并暴露安全问题。Web 开发者应熟悉跨站脚本攻击 (XSS), 这涉及向网页添加恶意脚本,这通常是因为网页无法正确转义注入的 HTML(因此,您执行搜索查询 其中包含文本 <script>)。后端开发者了解SQL 注入 无法正确验证用户输入的数据库查询会暴露安全问题( 小鲍比桌)。进行模糊测试,即模糊测试, 用于自动尝试向 API 提供多种不同的无效或意外输入内容,以及检查结果中是否存在安全漏洞; 崩溃或其他错误处理问题这些都属于故意提供不准确信息的示例。不过,在这里 (通过故意错误地生成用户代理),以鼓励开发者停止依赖这些数据。

正确做法

  • 检查您的代码库是否依赖用户代理字符串(搜索“navigator.userAgent”很可能会找到大多数匹配项 ,并且您的后端代码可能会寻找 User-Agent 作为标头,包括 依赖项
  • 如果您在自己的代码中发现了用途,请找出代码要检查的内容,并找到其他实现这种区分的方法 (或查找替换依赖项,或者通过提交问题或确认是否有更新,在上游处理该依赖项)。偶尔 区分浏览器是解决 bug 的必要条件,但是 User-agent 一旦被冻结,就会无法做到这一点。
  • 您可能很安全。如果您只使用品牌、主要版本和平台这三个核心价值观,那么这些核心价值几乎肯定仍然是 可用,且在用户代理字符串中正确无误。
  • MDN 介绍了一些可避免依赖用户代理字符串(“浏览器嗅探”)的好方法, 主要是特征检测。
  • 如果您以某种方式依赖用户代理字符串(即使使用仍然有用的几个核心值), 使用即将在新的浏览器版本中推出的用户代理进行测试的想法。您可以使用即将推出的浏览器 使用测试版或技术预览版构建版本,但也可以针对 测试。您可以在 Chrome、EdgeFirefoxSafari、 进行本地开发时,检查代码如何处理可能从用户处收到的不同用户代理值。

客户端提示

提供此类信息的一个主要方案是用户代理客户端提示, 但并非所有浏览器都支持此功能。支持的浏览器将传递三个标头:Sec-CH-UA, 浏览器品牌和版本号;Sec-CH-UA-Mobile:指明请求是否来自移动设备;和Sec-CH-UA-Platform, 用于为操作系统命名(解析这些标头并不如想象中简单,因为它们 结构化标头,而不是简单的字符串, 这是由发送“tricky”的浏览器值,如果解析得不正确,系统将不会对这些值进行正确处理。也就是 如前所述,浏览器预先执行“模糊测试”的示例。开发者必须使用这些数据来处理 因为数据经过精心设计,导致不当或延迟解析很可能会导致不良结果, 或字符串未正确关闭。)幸运的是,浏览器还会将此类数据直接作为 JavaScript 提供给 JavaScript navigator.userAgentData,在支持的浏览器中可能如下所示:

{
 
"brands": [
   
{
   
"brand": " Not A;Brand",
   
"version": "99"
   
},
   
{
   
"brand": "Chromium",
   
"version": "96"
   
},
   
{
   
"brand": "Google Chrome",
   
"version": "96"
   
}
 
],
 
"mobile": false
}