数字“指纹”收集是指尝试在用户回访您的网站时识别其身份,或跨不同网站识别同一用户。 您的设置与其他人的设置在许多方面可能会有所不同。例如,您可能使用的是其他类型的设备 且屏幕尺寸不同,且安装的字体也不同。如果我安装了字体“Dejavu Sans”,而您没有,那么任何网站都可以通过检查该字体来区分您和我。这就是“指纹”的运作方式;您可以收集这些数据点,每个数据点都会提供更多方法来区分用户。
更正式的定义可能如下所示:指纹是指使用用户设置的明显和不明显的长期特征,尝试将用户与尽可能多的其他用户区分开来。
为什么数字“指纹”收集会妨碍用户隐私
在某些极端情况下,对用户进行数字“指纹”收集很重要,例如欺诈检测。但指纹也可以用于跨网站跟踪用户,而且这种跟踪通常在未经用户同意的情况下进行,在某些情况下,则是基于未充分告知用户且无效的同意。完成上述操作后,这些用户通常会发现 不安心,感觉好像被背叛了。
指纹识别是指寻找方法来隐秘地区分用户。指纹技术可用于识别同一网站上是否仍是同一用户,或同时识别两个不同浏览器个人资料中的同一用户。也就是说,可以使用指纹跟踪跨网站的用户。确定性、明显的跟踪方法, (例如存储具有用户专属 ID 的 Cookie)在某种程度上可能被用户观察到并受其控制 (上一单元介绍了其中一些方法)。但正是由于它隐秘性强,因此更难避免;它依赖于不变的特征,并且很可能在不可见的情况下发生。正因如此, “fingerprinting”。无论是数字指纹还是手指末端的指纹,都很难更改。
浏览器供应商知道用户不喜欢被跟踪,因此他们不断实施相关功能来限制数字“指纹”收集 (部分内容我们已在上一单元中介绍过)。本文将介绍这些功能可能会对您的业务要求产生哪些影响,以及如何在不侵犯隐私的情况下实现您的目标。本文主要介绍浏览器如何防范指纹识别功能对您的影响,而不是介绍该功能如何阻止您使用指纹识别功能。
在实践中,大多数开发者和大多数企业都不需要对用户进行身份识别。如果您的应用需要用户登录 那么您的用户向您标识自己,同时获得他们的同意,并且他们可以单方面选择停用 选择最合适的广告素材这是一种有助于了解哪些用户登录的隐私保护方法。您的应用可能不会 这样可更好地保护用户(然后收集 只获取您需要的数据)。
正确做法
评估您的第三方以进行数字“指纹”收集。在第三方单元中,您需要 可能已经有一个列表,其中列出了您要包含的任何第三方服务及其发出的网络请求。您或许可以检查这些请求,了解传回给发起者的数据(如果有)。不过,这通常很难;因为指纹识别本质上是一种隐秘的过程,涉及请求不受用户批准的数据。
您还应阅读第三方服务和依赖项的隐私权政策,了解是否有使用指纹的迹象。有时也称为“概率匹配”,或属于一套概率匹配技术的一部分,与“确定性匹配”相对。
指纹识别的工作原理
您个人的上述所有属性组合常常对您来说独一无二,或 至少面向一小部分类似用户发布以便暗中跟踪您。
延伸阅读:被动和主动数字“指纹”收集
这里需要对被动数字“指纹”收集技术和主动数字“指纹”收集技术加以区分。被动指纹识别技术是指默认使用提供给网站的信息;主动指纹识别技术是指明确询问浏览器以获取更多信息。之所以要明确区分这两者,是因为浏览器可以尝试检测和拦截或缓解主动技术。API 可能会受到限制,或者需要通过对话框进行网关控制 请求用户许可(从而提醒用户正在使用这些权限,或允许用户拒绝这些权限) 定义)被动技术是指使用已提供给网站的数据,通常是因为在信息超级高速公路的早期,这些信息会提供给所有网站。用户代理字符串就是一个例子,我们稍后会对此进行详细介绍。它被认为非常有用,能够为我们提供 浏览器、版本和操作系统的 相关信息,这样网站就可以选择 并据此进行改进不过,这也增加了可辨识出的大量信息 以便区分不同的用户因此,此类信息越来越不再可用,或者至少是冻结的。 使其不再具有辨识度。如果您所做的操作依赖于此信息 - 例如,如果您采取不同的 代码分支,那么此代码可能会由于浏览器日益冻结或停止该信息而遭到破坏。 在这种情况下,最好的防范措施就是进行测试(详见下文)。
附录:衡量可被指纹识别的可能性
衡量这些数据点各自提供多少信息的技术指标称为“熵”,以比特为单位。具有许多不同可能值(例如已安装的字体列表)的特征可能会为总数贡献很多位,而没有太大区分能力的特征(例如您使用的操作系统)可能只会贡献几个位。HTTP 年鉴介绍了现有指纹库如何自动执行将来自许多不同 API 的响应组合成“哈希”的过程,该哈希可能仅能识别一小部分用户,甚至可能仅能识别一位用户。Maud Nalpas 在 这段 YouTube 视频,但简而言之,假设您在看到 好友列表,其中包括他们最喜欢的音乐、最喜欢的食物和他们所使用的语言...但还添加了他们的名字 已移除。任何一个人的列表都很有可能可在您的朋友中唯一地标识他们,或者至少可以缩小范围。 只有少数几个人可以参与进来这就是指纹的运作方式;您喜欢的内容列表会成为“哈希”。包含 从而更轻松地在两个未连接的不同网站上将用户识别为同一人, 跟踪:规避用户对隐私的期望。
浏览器如何防范数字指纹?
重要的是,浏览器供应商非常清楚网站(或网站上包含的第三方)可以通过许多不同的方式计算用户的独特指纹,或者通过不同的信息来增强指纹的唯一性。其中一些方式是明确的、刻意的,例如浏览器的用户代理字符串,通常 会识别浏览器、操作系统和使用的版本(如果您并 我使用的是其他浏览器)。有些方式并非刻意设计为支持指纹功能,但最终却是这样 如字体列表、可供浏览器访问的视频和音频设备(浏览器无需使用这些设备,只需按名称获取它们的列表即可。)有些特征在发布后才被确定为是导致出现指纹的原因,例如画布元素上抗锯齿字体的确切像素渲染。还有很多,而且您的浏览器与我的不同,浏览器都会增加熵,因而有可能增加 以便区分您与我之间的差别,并尽可能地识别个人在不同网站上的独特性。 https://amiunique.org 列出了很多容易造成指纹问题(但绝对不详尽)的列表 而且这一名单一直在不断增加(因为人们对于能够指纹识别用户的收益颇为丰厚),即使用户 您绝不想要该模式,或者可能并不希望执行这项操作)。
不支持某些强大的 API
浏览器供应商对所有这些计算用户指纹的方法做出了反应,那就是想方设法降低 这些 API 提供的熵的大小。最严格的选项是从一开始就不要实现这些功能。一些主流浏览器已针对各种硬件和设备 API(例如从 NFC 和蓝牙访问 客户端 Web 应用)。这显然会影响您的应用和服务:您无法在未实现某个 API 的浏览器中使用该 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 或不提供这些 API。
- 使用一个或多个声称用户隐私是其动机的浏览器进行测试。请尽可能在测试中涵盖您最常用的浏览器的即将发布的预发布版和测试版(如果有):Safari 的技术预览版、Chrome 的 Canary 版、Firefox 的Beta 版渠道。这样,您就有极大机会在这些更改影响到用户之前,发现会影响您网站的 API 故障和更改。同样,为用户环境和环境。如果您的用户群中使用旧版 Android 手机的用户数量较多,请务必在测试中包含这些设备。大多数用户没有开发团队所拥有的快速硬件和最新版本。
- 请同时使用干净的个人资料和无痕模式/无痕浏览模式进行测试;您可能已在个人资料中授予所需的权限。测试如果您针对任何问题拒绝向该网站授予权限,会发生什么情况。
- 在 Firefox 的指纹保护中明确测试您的网页 模式。这样做会在您的网页尝试获取指纹时显示权限对话框,或者会针对某些 API 返回模糊数据。 这有助于您确认服务中包含的第三方是否在使用可指纹识别的数据,或者您自己的服务是否依赖于您所提供的服务 然后,您可以考虑故意模糊测试是否会使执行您所需的操作变得更加困难。建议将 进行相应更正,以便从其他来源获取相应数据,不使用这些数据,或使用不太精细的数据。
- 如前面的“第三方”单元中所述,审核第三方
以了解其是否使用了数字“指纹”收集技术。被动数字“指纹”收集难以检测(并且
否则,数字“指纹”收集模式可能会标记一些数字“指纹”收集技术,
并寻找 navigator.userAgent 的用途或意外创建的
<canvas>
对象也可能会揭示一些方法 需要进一步审查。另外还需要考虑使用“概率匹配”一词或 用于描述第三方的技术材料;但有时可能表明使用了数字“指纹”收集技术。
跨浏览器测试工具
出于隐私保护目的测试代码的过程很困难,手动测试时需要注意的事项如上文所述。 例如,如果您拒绝向网站授予其尝试访问的任何 API 的权限,会发生什么情况?如何呈现给用户? 自动化测试无法判断网站的行为是帮助用户信任它,还是相反,会促使用户不信任它或认为它隐瞒了某些信息。
不过,网站通过审核后,您可以自动测试 API,以确认较新浏览器版本(或即将发布的“Beta”版和“预览”版)中没有任何问题,并且在很大程度上,这些测试应该包含在现有测试套件中。在使用 API Surface 覆盖率时,使用自动化测试工具时需要注意的是,大多数浏览器都允许对可用的 API 和功能进行一定程度的控制。Chrome 通过命令行开关执行此操作, 和 Firefox 一样,并且可在测试工具中访问这些元素 设置可让您在启用或停用 API 的情况下运行某些测试。(例如,请参阅 Cypress 的 browser-launch 插件和 Puppeteer 的 launch.args 参数,了解在启动时添加浏览器标志的方法。)
仅通过用户代理字符串获取粗略信息
再举一个例子,自从网络诞生以来,浏览器便在每次请求的 HTTP User-Agent 标头中发送自述。几乎长久以来,人们都在教网络开发者不要使用用户代理标头的内容 向不同的浏览器提供不同的内容 但一直以来,网络开发者都是这样做的 在某些(但不是所有)情况下提供正当理由。由于浏览器不希望被网站单独列出来提供不佳的体验,因此每款浏览器都会假装成其他浏览器,并且用户代理字符串看起来像这样:
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 提供的数据的示例。发送空白的用户代理标头会破坏无数网站,因为这些网站都已经存在。因此,一般来说,浏览器会移除其中的一些细节,然后从此之后保持不变。(您可以在 Safari、Chrome、 和 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。但冻结后,附属信息(芯片架构、所模仿的 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 一旦被冻结,就会无法做到这一点。
- 您可能很安全。如果您仅使用品牌、主要版本和平台这三个核心值,那么这些值几乎肯定仍可在 user-agent 字符串中使用且正确无误。
- MDN 介绍了避免依赖用户代理字符串(“浏览器嗅探”)的有效方法,其中主要方法是功能检测。
- 如果您以某种方式依赖用户代理字符串(即使使用仍然有用的几个核心值), 使用即将在新的浏览器版本中推出的用户代理进行测试的想法。您可以使用即将推出的浏览器 使用测试版或技术预览版本,但也可以针对 测试。您可以在 Chrome、Edge、 Firefox 和 Safari、 进行本地开发时,检查代码如何处理可能从用户处收到的不同用户代理值。
客户端提示
提供此类信息的一个主要方案是用户代理客户端提示,但并非所有浏览器都支持此方案。支持该功能的浏览器将传递三个标头:Sec-CH-UA
,用于提供浏览器品牌和版本号;Sec-CH-UA-Mobile
,用于指示请求是否来自移动设备;Sec-CH-UA-Platform
,用于指定操作系统。(解析这些标头并不像看起来那么容易,因为它们是结构化标头,而不是简单的字符串,浏览器会通过发送“棘手”值来强制执行此操作,如果未正确解析,系统将错误地处理这些值。也就是
如前所述,浏览器预先执行“模糊测试”的示例。开发者必须使用这些数据来处理
因为数据经过精心设计,导致不当或延迟解析很可能会导致不良结果,
或字符串未正确关闭。)幸运的是,浏览器还会将此类数据直接作为 JavaScript 提供给 JavaScript
navigator.userAgentData
,在支持的浏览器中可能如下所示:
{
"brands": [
{
"brand": " Not A;Brand",
"version": "99"
},
{
"brand": "Chromium",
"version": "96"
},
{
"brand": "Google Chrome",
"version": "96"
}
],
"mobile": false
}