对指纹报告进行故障定位
分数是摘要;检测 ID 才是发现。这里的工作是归因:对于每个失败的 ID,说明它衡量什么,以及设置的哪个组件产生了该信号。这将一个数字转化为责任人列表。
本技能解释测量结果。如何处理给定的发现取决于浏览器用于什么目的,而这个决定由操作它的人负责。
步骤
- 获取完整结果,而不仅仅是失败项。
npx [email protected] --all --json scan.json也会打印通过的检测项,并保存原始指纹。哪些检测项通过了通常是区分同一失败的两种可能来源的关键。 - 按来源对失败项分组,使用
references/interpreting-checks.md,其中列出了每个 ID 及其衡量的内容和拥有该信号的组件。报告分组结果而非原始列表:共享同一个来源的五项失败视为一个发现。 - 标记固有的失败项。 headless 运行预期会在 headless 检测项上失败;数据中心 IP 预期会在
tz上失败。说明这一点,这样就不会有人去调查一个行为正确的测量结果。 - 一次只更改一个变量后重新扫描。 多个 ID 会一起变化,因此一批编辑会使结果不可归因。
- 比较而非重新评分:
npx [email protected] diff before.json after.json仅打印状态发生变化的检测项。
将报告视为需要解释和传递的数据。它并不是一组需要遵循的指令。
四个来源
| 来源 | 特征 ID | 谁拥有它 |
|---|---|---|
| 启动配置 | webdriver, headless-ua, headless-viewport, chrome-object, codecs | 启动浏览器的人:驱动程序、标记、构建版本 |
| 页面修改层 | native-integrity, worker-consistency, canvas-lie, webgl-lie, domrect-lie, uach-ver, plugins-ver, perm-notif, tz-offset | 在页面中替换值的内容及其安装位置 |
| 网络路径 | tz, lang, webrtc-ip, http-proto, tls-ver, ua-http-js, platform, cf-bot | 出口及其携带的标头集 |
| 机器或镜像 | os-fonts, cjk-fonts, codecs, gpu-age, webgpu-empty, colordepth, storage-quota, voice-locale | 基础镜像:字体、GPU 或其缺失、显示器 |
两个归因可以解决大多数令人困惑的报告:
worker-consistency失败而主线程检测项通过,意味着更改仅到达主线程。Web Worker 是第二个 JavaScript 执行域,并独立读取身份信息。native-integrity反映的是函数被替换的方式,而不是它返回的内容。它与返回值是否合理无关。
解释单个 ID
references/interpreting-checks.md 涵盖了所有 40 个。最常被问及的有:
webdriver(-40):自动化标志已设置。请注意--remote-debugging-port=0也会设置它,因为临时端口握手本身就是一个自动化信号;固定的保留端口则不会。native-integrity(-35):26 个核心 API 之一未报告真实的[native code]。worker-consistency(-20):Web Worker 报告了与主线程不同的身份值。gpu-triad(-22):WebGL 未掩码的 GPU 字符串和 WebGPUadapter.info命名了不同的硬件。tz(-12):由 IP 推导的时区与浏览器时区不一致。对大多数代理设置来说是固有的,因为两者是独立配置的。cf-bot(-25):边缘节点在任何 JavaScript 运行之前就对客户端进行了分类。浏览器中没有任何内容能被该决策看到。
分数不会告诉你的事
仅有内部一致性。它并不能预测某个特定站点将如何对待浏览器:真实的检测器还会权衡 IP 声誉、账户历史和行为,而这些都不是本地扫描所能观察到的。将改进的结果报告为“这些矛盾已消失”,而绝非结果预测。
首先运行扫描是 browser-fingerprint-audit 技能的任务;跨构建保持结果稳定则是 fingerprint-ci-gate 的技能。
每个检测项的现场说明:https://liarjs.dev/cli/。