FingerprintJS OSS:采集与哈希来源
跟踪 FingerprintJS OSS 的 load()、来源顺序、组件错误和延迟 visitorId 哈希,不声称运行了检测器。
BotBrowser Team
BotBrowser 支持在声明的 Profile 输入下重复运行经授权的同源页面 fixture,并保留范围受限的能力、组件状态和摘要路径观察;但它不能运行第三方检测器、推断个人身份,或证明某个供应商使用相同信号。FingerprintJS OSS commit 7a738d0e9920c7431b34aff24b345a21f9054855 展示了 src/agent.ts、src/sources/index.ts 和 src/index.ts 中的实现。
TL;DR
load()默认将monitoring设为true;monitoring: false会跳过非个性化安装请求。get()采集组件,为每个组件暴露value或error,并返回延迟计算的visitorId。hashComponents()排序组件键并哈希规范化值;它说明库结果的来源,不证明身份。- 来源顺序有意义:异步来源先启动,WebGL 来源在可能影响渲染的来源之后运行。
Contents
跟踪公开入口
固定版本的 src/index.ts 导出 load、hashComponents、组件类型和来源注册表。公开接口并不会返回某个人,而是返回一个 agent,其 get() 解析为结构化结果。每次审查都保留 commit URL,因为移动的分支可能重新排序来源或改变字段。
load() 是异步的。它可能发送安装监控,等待 prepareForSources(),创建内置来源加载器并返回 agent。默认值 monitoring = true 是源码事实。fixture 应记录该选项是否被显式设置,不要把默认值描述成已测量的网络事件。
理解采集与 monitoring
src/agent.ts 定义了 LoadOptions.monitoring,并说明 false 会禁用非个性化 AJAX 请求。实现会对监控路径采样,并打开 m1.openfpcdn.io/fingerprintjs/v${version}/npm-monitoring;本文不声称实际发送了请求。安全的源码观察应记录选项、源码位置和文档中的用途,不保留请求头、cookie、账号标识符或第三方响应。
monitoring: false 是配置观察,不是匿名保证。页面仍可能采集组件,应用也可能发送自己的遥测。将库选项与应用策略和服务器日志分开。BotBrowser 自动化一致性文档介绍受控页面检查,但不能说明服务如何处理 visitorId。
保留 value 与 error 状态
get() 等待组件加载器并返回 components。组件类型允许 value 或 error,因此缺少能力不等于一个恰好为 null 的值。范围受限的 fixture 可以记录组件名称、状态(value 或 error)和粗略值形状,不应发布 Canvas 像素、音频样本、账号数据或所有组件值。
私有记录可以采用如下形式:
{
"fixtureId": "fpjs-source-01",
"commit": "7a738d0e9920c7431b34aff24b345a21f9054855",
"monitoringOption": "false",
"componentStatus": { "canvas": "value", "fonts": "value", "webGlBasics": "error" },
"hashAccess": "not-measured",
"testedOn": "2026-10-29"
}
记录区分组件错误和已成功但值被删减的组件。这样兼容性交接仍可执行,也不会把记录变成可复用的 Profile。相关浏览器侧比较可参考浏览器指纹验证和跨 realm 的浏览器 API 完整性。
报告中应区分三种情况。组件可能返回可用的值,可能返回为空或近似 null 的值,也可能拒绝并产生错误结果。删减还会引入第四种情况:测试确实拿到过值,但刻意没有保留。如果记录把这些情况都归为「缺失」,工程师就无法判断是浏览器缺少该 API、来源返回了合法的空结果、来源失败,还是隐私策略删掉了细节。
观察记录还应写明负责人和保留期限。原始组件值不要进入通用的工单系统、聊天记录或分析导出。如果诊断某个缺陷确实需要更完整的产物,就只把访问权交给处理该问题的人,并在调查结束后删除该产物。小而长久的记录应回答测试是否执行过、哪些粗粒度结果有差异,而不是保存长期可用的浏览器特征。
跟踪来源顺序与异步工作
src/sources/index.ts 声明异步来源置于前部,以便与其他来源并行运行。注册表从 userAgentData、fonts、domBlockers、fontPreferences、audio 和 screenFrame 开始,随后处理 canvas、屏幕、存储、语言、硬件和策略相关来源。这个精确列表是该 commit 的实现细节,不是通用浏览器指纹标准。
文件将 webGlBasics 和 webGlExtensions 放在末尾,因为某些来源可能影响其他来源,包括 WebGL 与 canvas。因此,来源顺序属于结果来源信息。如果后续 commit 移动了来源,应先比较 commit 和第一个变化的组件,再把新哈希归因于浏览器变化。
组件失败也适用同样的纪律。如果 webGlBasics 报告错误,不要推断 WebGL 在全局不可用,也不要断定所有下游输出都必然不同。请记录组件结果、测试条件,以及经授权 fixture 暴露出的任何直接浏览器错误。没有运行时追踪时,把解释标注为基于源码的可能性,而不是诊断结论。
理解摘要来源与延迟 visitorId
hashComponents() 对组件键排序,将值或字面量 error 序列化,转义组件名称中的分隔符,并将规范字符串交给 x64hash128。这个函数说明该库版本如何从组件对象推导摘要,但不证明输入唯一、稳定、属于真人或会被第三方接受。
visitorId getter 是延迟的。makeLazyGetResult() 立即计算 confidence,却只在第一次访问时调用 hashComponents(this.components),之后缓存结果。完全不读取 visitorId 的测试没有执行摘要路径;读取两次测试的是缓存复用,而不是两次独立采集。应将 hashAccess 记录为 not-measured、first-read 或 reused,不要编造运行结论。
confidence 是与标识符不同的字段,应按实现文档中说明的含义来解读。它既不是「结果属于同一个人」的校准概率,也不是服务一定接受的评分。请在笔记中把计算过程和延迟属性分开记录,避免把一次立即读取 confidence 误写成访问过标识符的证据。
建立范围受限的源码观察
以下命令获取固定源码,只打印结构性行。这是公开源码观察,不是 BotBrowser 运行,也不是对受保护网站的请求:
curl -fsSL https://raw.githubusercontent.com/fingerprintjs/fingerprintjs/7a738d0e9920c7431b34aff24b345a21f9054855/src/agent.ts | rg -n 'monitoring = true|hashComponents\(this.components\)|const components = await getComponents|request.open'
匹配行能确认该 commit 含有指定实现标记,但不能证明浏览器执行过它们。若需运行时证据,应在受限记录中保留浏览器版本、操作系统、Profile 生命周期、origin、选项、组件状态、哈希访问状态和日期,每次只改变一个声明输入。
明确隐私边界
W3C fingerprinting 指南将指纹视为隐私问题,MDN fingerprinting 词汇表解释了通用概念。源码来源和删减规则不能证明 FingerprintJS OSS 是完整检测器,也不能证明 visitorId 能识别个人。
将兼容性问题和隐私问题分开。组件错误可以解释应用的替代处理,但不能单独正当化原始值采集。如果版本检查只需要存在性、状态和摘要访问状态,就只保留这些字段并尽快删除。如果需要服务决定的证据,应通过授权集成测试获取,而不是从源码审查外推。
一次务实的最小化审查会在测试执行前问四个问题。哪条结论需要这个字段?能否用状态或形状代替具体值来回答?谁可以看到这个产物?产物何时删除?如果某个字段回答不了第一个问题,就删掉它。如果状态足够,就不要「以防万一」去采集高细节的值。把保留期限写进测试任务本身,而不是留到最后再提醒自己。
不要把阅读实现的结果当作合规结论。源码可以帮助定位采集路径和配置选项,但法律义务取决于上下文、目的、司法辖区、同意和完整的应用。隐私审查应基于真实部署及其数据流。本文仅限于解释所引用的源码,并建议一种更小的诊断记录。
Practical conclusion
固定 commit,将 monitoring 配置与运行时网络证据区分开,分别保留 value 和 error,并记录是否访问了延迟摘要。来源顺序和规范序列化解释结果来源,但不建立身份、熵、匿名性或第三方决定。
Sources
- 固定 commit 的 FingerprintJS OSS
agent.ts - 固定 commit 的 FingerprintJS OSS
sources/index.ts - 固定 commit 的 FingerprintJS OSS
index.ts - W3C fingerprinting 指南
- MDN fingerprinting 词汇表
- BotBrowser 指纹文档
Next reading
需要自有页面检查时,阅读浏览器指纹验证;同一属性需要跨上下文读取时,阅读跨 realm 的浏览器 API 完整性。
本文属于指南: 什么是浏览器指纹?原理、风险、信号与隐私边界