navigator.connection 无需权限提示即可读取网络速度与延迟,仅 Chromium 支持这件事本身也是一种指纹信号。
大多数指纹信号描述的是你的硬件或软件。Network Information API 描述的是完全不同的东西:承载页面本身的这条连接——它粗略的速度等级、实测的往返时延,以及你是否要求浏览器省着点用流量。这一切都不需要任何权限提示,而在实现了该 API 的浏览器内核上,任何页面在加载的瞬间就能读到它。
核心要点
navigator.connection暴露effectiveType、downlink、rtt和saveData,全程零权限提示——任何脚本都能在页面加载时读取你连接的粗略速度等级。- 这些数值经过刻意的分桶处理,而非原始值,目的是削弱指纹能力——但你落入的那个桶,一旦和其他数十种信号组合起来,仍会为综合指纹增加可测量的熵值。
- 仅 Chromium 支持。 Chrome、Edge、Opera 和三星浏览器都实现了它;Safari 和 Firefox 都没有实现
NetworkInformation或navigator.connection。 - 这道鸿沟本身就是一种信号——脚本可以把
navigator.connection是否存在,当作一种粗略、难以伪造的内核检测手段,完全独立于 User-Agent 字符串声称的内容。 - BrowserInsight 的指纹检测会报告你自己的浏览器暴露了哪些网络层属性,与你指纹中的其他信号并列展示。
navigator.connection:effectiveType、downlink、rtt、saveData
该 API 在 navigator.connection 上挂载了单个 NetworkInformation 对象。在实现了它的浏览器上,读取只需一行代码,且不需要任何用户交互:
const conn = navigator.connection;
console.log(conn.effectiveType); // "4g"、"3g"、"2g" 或 "slow-2g"
console.log(conn.downlink); // 估算带宽(Mbps),先四舍五入到最近的 25 kbps 再分桶
console.log(conn.rtt); // 估算往返时延(ms),先四舍五入到最近的 25ms 再分桶
console.log(conn.saveData); // 若用户开启了数据保护模式则为 true
四个属性在起作用。effectiveType 是浏览器自己基于近期观测到的 rtt 与 downlink 值,把你的连接归入四个世代分类之一——slow-2g、2g、3g 或 4g——而不是基于实际使用的无线电制式;一条被限速的 Wi-Fi 链路照样可能读出 "3g"。downlink 是估算的有效带宽,rtt 是到当前服务器的估算往返时延——两者都来自浏览器近期的真实网络传输,而非专为该页面重新跑一次探测。saveData 单纯反映用户是否开启了操作系统或浏览器层面的「数据节省」模式。部分 Chromium 构建还暴露一个 type 字段(wifi、cellular、ethernet、bluetooth、none 或 unknown),不过其可用性因平台而异。
粗粒度画像与熵值
规范作者明确指出,原始的、持续更新的带宽与时延数字本身就会是一个强指纹向量——某一时刻的实时吞吐读数,在特定网络路径上几乎是唯一的。这正是为什么 downlink 和 rtt 被四舍五入并分桶,而非以完整精度上报,也是为什么 effectiveType 把一切都压缩进仅仅四个粗粒度等级。这是一项真实的缓解措施,不是走走过场。
不过它并没有把贡献降为零。四档的 effectiveType、一个 rtt 桶、一个 downlink 桶,加上一个布尔型的 saveData 标志,组合起来依然构成一定数量的可区分状态——比起 Canvas 哈希这类信号要小得多,但一旦被折入屏幕尺寸、字体和 WebGL 输出组成的综合指纹,也并非毫无意义。它作为追踪信号真正有价值的地方,与其说是原始熵值,不如说是稳定性与跨上下文关联:同一条物理链路往往会在不同网站、乃至几乎同时打开的不同标签页之间,报出相同的 effectiveType/rtt 分桶,这就给了追踪者一条虽弱但免费的线索——两个会话可能共享同一网络——即便 Cookie 和存储已按站点隔离,这条线索在跨来源关联活动时依然有用。它同时也是一种合理性检验:一个自称在「4g」移动网络上、却对住宅 ISP 端点报出低于 20ms RTT 的会话,读起来就很矛盾,就像 IP 地理位置与时区不符 技术那样,靠的不是任何单一信号,而是独立信号之间的矛盾来发出警报。
仅 Chromium 支持本身就是一种信号
这个 API 的覆盖面才是最容易被忽略的部分。caniuse.com 的兼容性数据表显示全球支持率大致落在 75%–80% 区间——这并不是因为它是个小众或实验性功能,而是因为它在每一款 Chromium 系浏览器上都已上线,却在其他任何浏览器上都不存在。Safari 从未实现过 NetworkInformation;Firefox 多年前曾在实验标志位后面短暂尝试过早期版本,随后又移除了它——如今这两款浏览器都不再暴露 navigator.connection。定义这个 API 的 WICG 规范仓库本身就挂在与 Chromium 关系密切的 Web Incubator Community Group 名下,而在这个生态之外,采纳始终没有真正发生过。
这种不对称之所以有用,恰恰是因为它不依赖脚本从连接数值里读到了什么——它只取决于 navigator.connection 是否存在。一段脚本只需检查 'connection' in navigator,就能得到一个近乎瞬时、零权限的信号,把浏览器内核缩小到「某个 Chromium 内核」还是「非 Chromium」,而完全不依赖 User-Agent 字符串或 User-Agent Client Hints 声称的内容。这让它成为一种规模虽小却确实有用的交叉验证手段,与 TCP/IP 协议栈指纹 或 TLS 指纹识别 属于同一类信号:想令人信服地伪造它们很难,因为要么得真正运行那个底层内核,要么就得费心复现一个大多数伪装工具懒得去碰的行为细节。一个声称自己是 Safari、却依然能解析出真实 navigator.connection 对象的 UA 字符串伪装者,正在无声地自相矛盾。
隐私考量
这项信号并不需要像 Canvas 或 WebGL 指纹那样激进的防御措施,很大程度上是因为 API 自身的设计已经把风险限定住了:
- 分桶处理确实在发挥作用。 由于
downlink和rtt已经是四舍五入、量化过的数值而非原始值,你再自行想办法进一步遮蔽它们,也不会获得多少额外保护——规范早已收拢了这个信号本来最要命的高精度版本。 - 注重隐私的浏览器已经从根本上移除了这个暴露面。 由于 Firefox 和 Safari 完全没有实现这个 API,使用其中任何一款都会彻底消除这一向量——无需任何配置。
- Chromium 用户手上的直接控制权较少。 页面没有像摄像头或定位权限那样的用户可见开关来隐藏
navigator.connection,因为这个 API 从一开始设计时就没有被纳入权限模型——它被认为风险足够低,不需要一道许可关卡。 - 把它当作众多弱信号中的一个。 与屏幕几何、字体和 WebGL 结合起来看,它只是更大指纹中一个微小的增量——值得了解,不值得为它单独忧心。
- 看看你自己的设置暴露了什么。 BrowserInsight 的指纹检测会显示
navigator.connection在你当前浏览器中是否存在、报出了什么值,以及你暴露的其余信号集合。
常见问题
Network Information API 需要权限提示吗?
不需要。在支持它的浏览器上,navigator.connection 及其属性可被任何脚本在页面加载时读取,不需要任何用户手势、对话框或授权——这一点和定位或摄像头访问不同。
网站能通过这个 API 拿到我确切的网速吗?
不能,不够精确。规范刻意对 downlink 和 rtt 做了四舍五入与分桶处理,effectiveType 也只汇报四个粗粒度世代等级之一。你能拿到的只是一个粗略的连接档次,而非达到测速工具精度的实时测量结果——要拿到那种精度,网站得真正传输数据并计时,就像 BrowserInsight 的网络测速所做的那样。
为什么 Firefox 和 Safari 不支持这个 API?
两款浏览器都只是从未将它作为稳定特性上线;Firefox 曾在实验标志位后面尝试过早期版本,之后又移除了。如今的支持仅限于 Chromium 系浏览器——包括 Chrome、Edge、Opera 和三星浏览器——caniuse.com 对此也有明确记录。
我能用浏览器扩展屏蔽这个信号吗?
间接可以——一个能阻止 JavaScript 执行、或在页面脚本运行前剥离 navigator.connection 的扩展就能堵住它,但并没有专门针对这一个 API 的、广泛使用的独立扩展,因为相比 Canvas、WebGL 和字体信号,它的贡献本来就属于次要的。改用 Firefox 或 Safari 则无需任何扩展即可彻底移除这一信号。
总结
Network Information API 很好地示范了一种设计上就偏小、却依然值得理解的指纹信号。它的作者显然预见到了这一风险,并对数值做了分桶处理来削弱它,所以单靠 navigator.connection 无法识别出你。它真正增加的是一层叠加在更大综合指纹之上的粗粒度跨上下文稳定性线索——同样重要的是,它还是一道免费、难以伪造的浏览器内核检测手段,因为只有 Chromium 才完整实现了它。这两点都不需要专门的防御手段:它基本上会顺带被你为管理浏览器指纹其余部分所做的一切一并覆盖。
推荐阅读:


