Navigator 属性指纹:浏览器信息泄露
navigator.platform、hardwareConcurrency 和 deviceMemory 如何暴露你的身份,以及如何确保一致的 navigator 属性。
简介
JavaScript 中的 navigator 对象是任何网站可用的最容易访问的设备信息来源之一。navigator.platform、navigator.hardwareConcurrency、navigator.deviceMemory、navigator.userAgent 和 navigator.languages 等属性会暴露有关你的操作系统、CPU、RAM 和浏览器配置的详细信息。单独来看,每个属性提供的标识能力有限。但组合在一起,它们形成了一个复合指纹,可以显著缩小用户人群范围。与可能需要权限的实验性 API 不同,navigator 属性是普遍可用的、被广泛支持的,并且几乎被网络上每个追踪脚本查询。本文解释 navigator 属性如何用于指纹采集,以及 BotBrowser 如何为每个属性提供一致的、配置文件驱动的值。
隐私影响
Navigator 属性是浏览器指纹的基础层。每个追踪脚本都从 navigator 开始,因为数据是免费的、不需要权限,且立即可用。
2020 年爱荷华大学的一项研究分析了超过 100,000 个浏览器指纹,发现 navigator.userAgent、navigator.platform、navigator.hardwareConcurrency、navigator.deviceMemory 和 navigator.languages 的组合平均提供 12.8 位识别信息。作为参考,12.8 位可以区分大约 7,000 种唯一配置。加上屏幕分辨率和时区,该组合通常可以唯一识别超过 90% 的用户。
W3C 的隐私利益小组已广泛记录了 navigator 属性的隐私影响。他们的指纹指南文件将 hardwareConcurrency、deviceMemory 和 languages 列为对跨站追踪有意义贡献的"高熵"表面。尽管如此,这些属性在所有主要浏览器中仍然无限制可用,因为太多合法的 Web 应用依赖于它们。
企业和开发环境面临额外风险。64 核 hardwareConcurrency(服务器测试)、0.25 GB deviceMemory(嵌入式设备)或不寻常的语言组合等非标准值在任何人群中都会立即引人注目。
技术背景
navigator 对象包含数十个属性。以下是对指纹最重要的属性:
核心身份属性
navigator.userAgent- 用户代理字符串。包含浏览器名称、版本、操作系统名称和操作系统版本。尽管有弃用的努力,它仍然是被查询最多的属性。navigator.platform- 返回标识平台的字符串:"Win32"、"MacIntel"、"Linux x86_64"、"Linux armv81" 等。navigator.vendor- 返回浏览器供应商。Chrome/Chromium 系浏览器为 "Google Inc.",Firefox 为 "",Safari 为 "Apple Computer, Inc."。
硬件属性
navigator.hardwareConcurrency- 返回逻辑 CPU 核心数。消费设备的常见值从 2 到 16。高于 16 或低于 4 的值会显著缩小人群范围。navigator.deviceMemory- 返回大约 RAM(以 GB 为单位)。可能的值为 0.25、0.5、1、2、4 和 8(上限为 8)。此 API 仅在 Chromium 系浏览器中可用。
区域设置和语言属性
navigator.language- 返回首选语言(如 "en-US")。navigator.languages- 返回按优先顺序排列的首选语言数组(如 ["en-US", "en", "fr"])。
连接和媒体属性
navigator.connection- NetworkInformation API,暴露effectiveType、downlink、rtt和saveData。这些值反映网络状况,但足够稳定以用于指纹采集。navigator.mediaDevices- 枚举媒体设备可以暴露摄像头、麦克风和音频输出的数量和类型。
User Agent Client Hints
现代 Chromium 浏览器还暴露 navigator.userAgentData,提供对浏览器品牌、平台和移动状态的结构化访问。高熵的 getHighEntropyValues() 方法返回详细的平台版本、架构、位数和设备型号信息。
为什么这些值会变化
Navigator 属性值取决于:
- 操作系统。 平台字符串、默认语言和可用内存 API 因操作系统而异。
- 硬件。 CPU 核心数和内存大小取决于硬件。
- 浏览器版本。 用户代理字符串随每次发布而变化。Client Hints 品牌和版本也在演变。
- 用户配置。 语言偏好和区域设置由用户控制。
这些值的分布是不均匀的。少数配置(8 核 Windows 10,8 GB RAM,en-US 语言)非常常见。其他一切都越来越稀少,越来越容易识别。
常见保护方法及其局限性
用户代理伪装是最古老、最常见的方法。扩展或浏览器设置将 navigator.userAgent 更改为不同的字符串。问题是:大多数伪装工具只更改 UA 字符串而不调整其他相关属性。通过用户代理声称是 macOS 而 navigator.platform 显示 "Win32" 是一个明显的不一致。
VPN 对 navigator 属性没有影响。这些值由浏览器和操作系统决定,而不是网络。
隐身/隐私模式不改变 navigator 属性。你的指纹在正常和隐私浏览中是相同的。
浏览器扩展修改 navigator 属性是在 JavaScript 中操作的,可以被检测到指纹本身。navigator 属性上修改的 getter 可以通过原型链检查和计时分析被检测到。
随机化 navigator 属性会创建不切实际的组合。一个具有 3 个 CPU 核心、3 GB 内存和 "Win64" 平台字符串的设备不对应任何真实硬件。这些组合比诚实值更独特,更容易被识别。
根本挑战是一致性。Navigator 属性必须形成一个与真实设备配置匹配的连贯集合。平台必须匹配用户代理。核心数必须对报告的硬件而言是现实的。内存必须与平台一致。语言必须对报告的区域设置而言是合理的。
BotBrowser 的引擎级方法
BotBrowser 通过其配置文件系统在引擎级别配置所有 navigator 属性。当加载配置文件时,navigator 对象上的每个属性都返回从已分析设备派生的值。
完整属性覆盖
BotBrowser 的配置文件为所有指纹相关的 navigator 属性定义值:
userAgent、appVersion、platform、vendor和appCodeName都与已分析的浏览器和操作系统一致。hardwareConcurrency匹配已分析设备的 CPU 配置。deviceMemory匹配已分析设备的 RAM 等级。language和languages匹配已分析的区域设置。userAgentData(brands、platform、mobile 标志、fullVersionList)根据已分析的浏览器品牌和版本生成。
内部一致性
BotBrowser 方法的关键优势在于所有属性都来自单个连贯的配置文件。不会出现 platform 显示 "MacIntel" 而 userAgent 包含 "Windows NT 10.0" 的场景。配置文件定义设备身份,所有 navigator 属性都反映它。
这扩展到 User Agent Client Hints。当网站调用 navigator.userAgentData.getHighEntropyValues() 时,返回的 platform、platformVersion、architecture、bitness、model 和 fullVersionList 都匹配配置文件。请求中发送的 Sec-CH-UA-* HTTP 头与 JavaScript 值匹配。
网络信息控制
使用 --bot-network-info-override 标志,BotBrowser 还控制 navigator.connection 值(rtt、downlink、effectiveType、saveData)和相应的 Client Hints 头。这确保与网络相关的 navigator 属性与配置文件一致。
Worker 一致性
Navigator 属性在 Web Workers 和 Service Workers 中也可用。BotBrowser 确保在所有执行上下文中返回相同的值,包括专用 Worker、共享 Worker 和 Service Worker。不会出现 Worker 返回你的真实硬件值而主线程返回配置文件值的间隙。
配置与使用
基本配置文件加载
chrome --bot-profile="/path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
所有 navigator 属性从配置文件自动配置。
语言和区域设置覆盖
# 从 IP 自动检测(默认)
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-languages=auto \
--bot-config-locale=auto
# 手动覆盖
chrome --bot-profile="/path/to/profile.enc" \
--bot-config-languages="fr-FR,fr,en" \
--bot-config-locale="fr-FR"
网络信息覆盖
chrome --bot-profile="/path/to/profile.enc" \
--bot-network-info-override
Playwright 集成
const { chromium } = require('playwright');
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-config-languages=auto',
'--bot-config-locale=auto',
'--bot-config-timezone=auto'
]
});
const page = await browser.newPage();
await page.goto('https://example.com');
// 验证 navigator 属性
const platform = await page.evaluate(() => navigator.platform);
const cores = await page.evaluate(() => navigator.hardwareConcurrency);
console.log(`Platform: ${platform}, Cores: ${cores}`);
Puppeteer 集成
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
defaultViewport: null,
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-network-info-override'
]
});
const page = await browser.newPage();
await page.goto('https://example.com');
验证
属性一致性检查。 查询所有 navigator 属性并验证它们形成一个连贯的集合。平台应匹配用户代理操作系统。核心数应对平台而言是现实的。内存应是合理的。
Client Hints 验证。 使用 navigator.userAgentData.getHighEntropyValues(['platform', 'platformVersion', 'architecture', 'bitness', 'model', 'fullVersionList']) 并确认值匹配配置文件。检查 Sec-CH-UA-* HTTP 请求头匹配 JavaScript 值。
Worker 一致性。 在 Web Worker 中运行相同的 navigator 属性查询,并与主线程比较结果。它们应该是相同的。
跨会话稳定性。 使用相同配置文件在多个会话中查询 navigator 属性。所有值应完全相同。
最佳实践
- 始终加载配置文件。 不使用
--bot-profile,navigator 属性反映你的实际系统。配置文件提供受控值。 - 对区域设置信号使用自动检测。
--bot-config-timezone=auto、--bot-config-locale=auto和--bot-config-languages=auto从你的代理 IP 派生区域设置,保持 navigator 语言属性与你的表面位置一致。 - 不要手动覆盖单个属性。 配置文件确保内部一致性。覆盖一个属性(如 hardwareConcurrency)而不调整相关值会创建不一致。
- 监控用户代理格式变化。 浏览器用户代理字符串随每个版本而变化。使用 BotBrowser 配置文件仓库中的最新配置文件以保持更新。
- 在主线程和 Worker 中都进行测试。 验证所有执行上下文中的 navigator 一致性。
常见问题
问: navigator.hardwareConcurrency 真的有助于识别用户吗? 答: 是的。虽然常见值(4、8)被许多用户共享,但不常见的值(1、2、6、24、64)高度可识别。与其他 navigator 属性结合,即使是常见值也对整体指纹有贡献。
问: navigator.deviceMemory 在 Firefox 或 Safari 上会怎样? 答: deviceMemory 是 Chromium 独有的 API。Firefox 和 Safari 不暴露它。针对 Chrome/Edge/Brave 的 BotBrowser 配置文件包含 deviceMemory 值。如果配置文件针对不支持此 API 的浏览器,则不会暴露。
问: 网站能检测到 navigator 属性被修改了吗? 答: 实现不佳的修改(JavaScript 覆盖)可以通过原型检查和计时分析被检测到。BotBrowser 的引擎级控制在源头修改属性,因此没有 JavaScript 可见的特征。
问: BotBrowser 处理 User-Agent 减少(UA-CH)变化吗?
答: 是的。BotBrowser 生成匹配配置文件的正确 User Agent Client Hints(Sec-CH-UA-*)头和 navigator.userAgentData 值。减少的用户代理字符串和高熵提示都是一致的。
问: BotBrowser 如何处理 navigator.webdriver?
答: BotBrowser 通过其配置文件系统控制 navigator.webdriver 属性,确保它为浏览上下文返回预期值。
问: navigator 属性是否受 --bot-noise-seed 标志影响? 答: Navigator 属性是确定性值(核心数、内存、平台),不涉及噪声。它们直接来自配置文件。噪声种子影响渲染输出(Canvas、WebGL、音频),而不是硬件身份属性。
总结
Navigator 属性构成浏览器指纹的基础层。它们普遍可访问,不需要权限,组合时提供显著的识别信息。BotBrowser 通过其配置文件系统在引擎级别控制所有 navigator 属性,确保用户代理、平台、硬件、区域设置和 Client Hints API 之间的内部一致性。结合时区、区域设置和语言设置的自动检测,BotBrowser 产生一个与真实设备配置匹配的连贯浏览器身份。
有关相关主题,请参阅 What is Browser Fingerprinting、CPU Core Count Control、Screen and Window Protection 和 Timezone, Locale, and Language。