Network Info API 指纹:连接类型与身份
navigator.connection 属性(如 effectiveType、RTT 和 downlink)如何创建网络指纹,以及如何控制它们。
简介
现代 Web 浏览器通过 Network Information API(navigator.connection)暴露连接详细信息。此 API 最初旨在帮助 Web 开发者更高效地提供内容。例如,网站可能向较慢连接的用户提供较低分辨率的图像,或在带宽有限时延迟非关键资源。effectiveType、rtt(往返时间)、downlink(带宽估计)和 type(连接类型)等属性都有助于这些自适应决策。
虽然此功能改善了浏览体验,但它也引入了一个重要的指纹表面。每次你的浏览器报告其连接特征时,它都在分享有关你的网络环境、你的 ISP,甚至可能是你的地理位置的信息。当这些细节与其他浏览器信号结合时,会创建一个更具体的档案,可以在用户不知情或不同意的情况下跨浏览会话识别和追踪用户。
BotBrowser 协调 navigator.connection 属性,让浏览器报告的值遵循已加载的指纹配置文件,而不是暴露设备的网络环境。
为什么网络信息对隐私很重要
网络连接数据构成了独特的隐私挑战,因为这些值是动态的。与屏幕分辨率或已安装字体等静态浏览器属性不同,网络指标会随时间变化。然而,这些变化值创建的模式仍然可以作为强大的追踪辅助,特别是当与其他指纹信号结合时。
以下是网络信息引起隐私问题的原因:
- 地理暴露: 连接延迟值与到服务器的物理距离相关。如果你的浏览器持续报告到某个区域的服务器低延迟而到另一个区域高延迟,这种模式即使没有 IP 地理定位数据也能暴露你的大致位置。
- ISP 和连接类型分析: 不同的互联网服务提供商和连接技术产生特征性的网络签名。光纤连接产生的延迟和带宽模式与蜂窝数据连接或卫星链路有明显不同。这些差异有助于缩小你的身份范围。
- 代理和 VPN 暴露: 当你通过代理或 VPN 连接时,
navigator.connection值可能与代理出口位置的预期网络行为不一致。这种报告连接数据与表面 IP 地址之间的不匹配可以暴露你正在使用代理,破坏代理本应提供的隐私。 - 会话关联: 虽然单个网络读数波动,但你的连接值随时间的统计分布形成可识别的模式。这种模式可用于将不同的浏览会话关联回同一用户。
saveData 属性指示用户是否启用了数据节省偏好,为指纹添加了另一个维度。只有少数用户启用此功能,使其本身成为一个独特的标识符。
INRIA 的研究发现,网络信息与计时分析结合时,可以将跨会话用户识别准确率提高 8%。该 API 不需要权限且在后台静默运行,从隐私角度来看这尤其令人担忧。
理解 Network Information API
暴露了哪些属性
Network Information API 通过 navigator.connection 提供多个属性:
effectiveType: 根据观察到的性能指标将连接分类为slow-2g、2g、3g或4g。rtt: 往返时间的估计值(毫秒)。downlink: 下行带宽的估计值(兆位/秒),四舍五入到最近的 25 Kbps。type: 底层连接技术,如wifi、cellular、ethernet或unknown。saveData: 布尔值,指示用户是否请求减少数据使用。
为什么标准隐私工具不够
了解为什么常见方法不能充分解决网络指纹问题,有助于解释 BotBrowser 为什么采用不同的方法。
VPN 和代理服务器改变你的可见 IP 地址,但不修改 navigator.connection 报告的值。你的浏览器继续测量和报告真实的网络状况。在许多情况下,VPN 增加的路由开销实际上使网络指纹更加独特,因为它创建了高延迟与表明附近位置的 IP 地址的不寻常组合。
隐私浏览模式不会改变网络信息。navigator.connection API 的结果由浏览器和配置决定。
浏览器扩展可以尝试覆盖 navigator.connection 属性,但它们面临一致性挑战。静态覆盖值会创建一个永远不变的网络档案,而其他 API 可能仍然报告实际网络状态。
完全阻止 API 也是有问题的。如果 navigator.connection 缺失或返回意外值,这种缺失本身就成为一个区分信号。很少有合法的浏览器配置完全缺少此 API。
这些限制的存在是因为网络信息与浏览器的多个路径相关。有效的保护需要让相关报告保持一致。
BotBrowser 如何保护你的网络身份
BotBrowser 从会话开始协调 navigator.connection API 报告的值,让直接读取属性和更改事件遵循选定的配置。
基于配置文件的网络保护
每个 BotBrowser 指纹配置文件都包含从真实设备配置捕获的逼真网络信息值。当你加载配置文件时,浏览器自动应用这些值:
chrome --bot-profile="path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
配置文件包含适当的 rtt、downlink、effectiveType、type 和 saveData 值,它们在内部一致且对配置文件代表的连接类型而言是逼真的。这意味着你不需要手动配置单个网络属性。配置文件一起处理所有这些,维护真实浏览器会展示的值之间的关系。
显式网络信息覆盖
对于需要显式控制网络信息报告的场景,BotBrowser 提供 --bot-network-info-override 标志:
chrome --bot-profile="path/to/profile.enc" \
--bot-network-info-override \
--user-data-dir="$(mktemp -d)"
启用此标志后,浏览器只从配置文件报告网络信息值,而不是测量实际网络连接。这也控制相应的 Client Hints 头(RTT、Downlink、ECT、Save-Data),确保 JavaScript API 值和 HTTP 头值之间的一致性。覆盖适用于所有属性,防止真实网络状态变化在会话期间泄露。
使用代理时的一致保护
网络信息保护最重要的用例之一是在通过代理浏览时维护一致性。BotBrowser 确保 navigator.connection 值与代理位置的预期网络特征一致:
chrome --bot-profile="path/to/profile.enc" \
--proxy-server="http://us-proxy:8080" \
--bot-network-info-override \
--user-data-dir="$(mktemp -d)"
当配置文件配置了适合代理地理区域的网络值时,整个浏览身份保持连贯。报告的连接特征匹配该位置用户的预期,消除了传统上暴露代理使用的不匹配。
变更事件管理
在标准浏览器上,navigator.connection 对象在网络条件变化时触发 change 事件。这些转换可以暴露有关你实际环境的信息,例如从 Wi-Fi 切换到蜂窝数据。BotBrowser 管理 change 事件以匹配配置文件预期的网络稳定性,确保主机网络的真实变化不会在会话期间泄露。
配置示例
覆盖策略如何解析
--bot-network-info-override 是策略开关,不是让所有网络数字永久固定的请求。BotBrowser 按以下顺序解析:
- 没有覆盖时使用浏览器原生网络估算器,页面看到经过正常取整和隐私分桶的实测值。
- 使用
profile时,加载的配置文件提供网络字段基准,浏览器仍会应用合法范围、取整和按 host 的变化。 - 使用 JSON 对象时,只覆盖对象中写明的字段。未写明的字段在有 profile 时使用 profile 基准,否则使用原生实测值。
profile 或 JSON 中的数值是基准。rtt 和 downlink 仍按浏览器规则规范化,包括范围限制、隐私分桶和小幅按 host 变化。
覆盖策略会应用到每个 browser context。其页面、worker 和请求使用同一网络身份,新 context 可以使用自己的 profile 而不改变已有 context。JavaScript API 与 RTT、Downlink、ECT、Save-Data Client Hints 使用同一结果,但不会改变代理实际速度或服务器直接测量的延迟。
非法输入不会导致浏览器退出。若策略不支持、类型错误、JSON 损坏或为空,BotBrowser 会忽略该策略并继续使用原生实测值。其他 profile 字段和兄弟 context 仍可用。
基本 CLI 使用
# 基于配置文件的网络信息保护
chrome --bot-profile="path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
# 使用显式网络信息覆盖实现完全控制
chrome --bot-profile="path/to/profile.enc" \
--bot-network-info-override \
--user-data-dir="$(mktemp -d)"
Playwright 集成
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: 'path/to/botbrowser/chrome',
args: [
'--bot-profile=path/to/profile.enc',
'--bot-network-info-override',
],
headless: true,
});
const context = await browser.newContext({ viewport: null });
const page = await context.newPage();
const networkInfo = await page.evaluate(() => {
const conn = navigator.connection;
return {
effectiveType: conn.effectiveType,
rtt: conn.rtt,
downlink: conn.downlink,
type: conn.type,
saveData: conn.saveData,
};
});
console.log('Network info:', networkInfo);
await browser.close();
})();
Puppeteer 集成
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: 'path/to/botbrowser/chrome',
args: [
'--bot-profile=path/to/profile.enc',
'--bot-network-info-override',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('about:blank');
const connInfo = await page.evaluate(() => ({
effectiveType: navigator.connection.effectiveType,
rtt: navigator.connection.rtt,
downlink: navigator.connection.downlink,
}));
console.log('Connection info:', connInfo);
await browser.close();
})();
完整身份一致性
为了全面的指纹保护,将网络信息控制与其他身份设置结合,创建完全一致的浏览档案:
chrome --bot-profile="path/to/profile.enc" \
--proxy-server="socks5://user:pass@us-proxy:1080" \
--bot-network-info-override \
--bot-timezone="America/New_York" \
--bot-locale="en-US" \
--user-data-dir="$(mktemp -d)"
此配置确保你的时区、区域设置、网络信息和 IP 地址都讲述相同的地理故事,创建连贯且逼真的浏览身份。
验证
使用配置文件启动 BotBrowser 后,你可以验证网络信息保护是否正常工作:
const conn = navigator.connection;
console.log('effectiveType:', conn.effectiveType);
console.log('downlink:', conn.downlink, 'Mbps');
console.log('rtt:', conn.rtt, 'ms');
console.log('type:', conn.type);
console.log('saveData:', conn.saveData);
// 验证值随时间保持稳定
setTimeout(() => {
console.log('After 5s - rtt:', conn.rtt, 'downlink:', conn.downlink);
}, 5000);
检查事项:
effectiveType适合配置文件的网络类别(宽带连接为4g,较慢连接为3g)rtt值与代理位置一致(附近服务器值较低,远距离服务器值较高)downlink对配置文件代表的连接类型而言是逼真的- 值在会话期间保持稳定,无意外变化
saveData匹配配置文件的配置- 指纹测试工具不报告异常或不一致
最佳实践
-
使用代理时始终使用
--bot-network-info-override。 这是最重要的建议。没有覆盖,真实的网络测量可能泄露并与代理位置的预期特征矛盾,可能破坏你的隐私设置。 -
将网络值匹配到地理位置。 选择网络值对你使用的代理位置而言逼真的配置文件。配置为宽带连接的配置文件应具有对代理服务器地理区域而言合理的延迟值。
-
使用从真实设备捕获的配置文件。 BotBrowser 配置文件包含来自实际设备捕获的网络信息值,确保值逼真且内部一致。这比手动指定单个网络参数可靠得多。
-
将网络保护与其他指纹控制结合。 当网络信息与其他数据点结合时,作为指纹信号最有效。同样,当与 BotBrowser 的其他指纹控制(包括时区、区域设置和 WebRTC 保护)结合时,网络信息保护最有效。
-
在开始重要会话前验证你的配置。 使用上面的验证脚本确认所有网络值正确报告且随时间保持稳定。
常见问题
Network Information API 在所有浏览器上都可用吗?
不是。具有所有属性的完整 API 在 Chrome、Edge 和 Opera 中可用。Firefox 支持有限,Safari 完全不支持。BotBrowser 配置文件考虑了目标浏览器的 API 支持级别,因此指纹与所模拟的浏览器品牌保持一致。
BotBrowser 还控制与网络信息相关的 Client Hints 头吗?
是的。启用 --bot-network-info-override 时,BotBrowser 同时控制 JavaScript API 值和相应的 Client Hints HTTP 头(RTT、Downlink、ECT、Save-Data)。这确保了页面通过 JavaScript 可以读取的内容与服务器在请求头中看到的内容之间的一致性。
网站能通过其他 API 测量真实网络延迟吗?
是的。Resource Timing API(performance.getEntriesByType('resource'))可以测量实际请求延迟。BotBrowser 通过 --bot-time-scale 的计时控制有助于维护 navigator.connection 值与可观察请求计时之间的一致性,提供额外的指纹保护层。
saveData 属性对指纹重要吗?
是的。只有少数用户启用数据节省模式,当存在时这使其成为一个独特的信号。BotBrowser 配置文件设置 saveData 以匹配目标设备配置。对于大多数桌面配置文件,这设置为 false,反映典型的使用模式。
BotBrowser 如何处理会话期间的网络状态变化?
BotBrowser 管理 navigator.connection 上的 change 事件,使主机机器上的真实网络转换不会泄露到网页。报告的网络状态在整个会话期间保持与加载的配置文件一致,无论实际网络上发生什么。
这能防御服务器端延迟测量吗?
不能。服务器端延迟测量(服务器测量自己请求的往返时间)在浏览器之外运行,任何客户端工具都无法控制。BotBrowser 的网络信息保护控制客户端 API 值。对于网络级一致性,使用适当的代理服务器为目标地理区域提供逼真的延迟特征。
我可以在没有配置文件的情况下设置自定义网络信息值吗?
--bot-network-info-override 标志与加载的配置文件配合工作。配置文件提供要报告的具体值。如果你需要不同的网络特征,使用匹配所需配置的不同配置文件,或将当前配置文件与适当的代理设置结合。
总结
Network Information API 暴露的连接特征可作为浏览器指纹信号。BotBrowser 使用配置文件和 --bot-network-info-override 标志,让选定上下文中的报告值保持一致。JavaScript API 与相关 Client Hints 可以描述同一策略,而代理负责真实网络路由。相关主题请参阅 proxy configuration、DNS leak prevention 和 timezone and locale configuration。