BrowserLeaks 是一套独立测试,不是单一分数:讲清楚 WebRTC、DNS、Canvas、WebGL 等测试各自能看到什么,以及它们共同的盲区。
搜索「browserleaks」,你会看到一整页独立的测试方块——IP、WebRTC、Canvas、WebGL、字体、TLS——每一个都打开成自己的一份报告。第一次访问的用户通常会期待一个单一的数字,就像信用分或信任评级那样,结果发现没有这种东西,于是感到困惑。这种困惑并不是设计缺陷,而是面对一种本质上不同的工具时的正常反应:这是一套探测套件,每项测试各自衡量浏览器的一个面,谁也不试图去概括谁。
核心要点
- BrowserLeaks 这类套件针对每个面各跑一项独立测试——IP/WebRTC、DNS、Canvas、WebGL、字体、TLS——没有一个可以追求的综合分数。
- 每项测试回答的是「这里暴露了什么」,而不是「这一切合起来让我有多容易被识别」。这是两个不同的问题,答案也不一样。
- 每项单独测试都「干净」,不代表你就难以被追踪——它只说明测试到的这几个面本身没有意外泄露。
- 任何浏览器端测试都有的结构性盲区:跑在浏览器里的任何东西,都无法把你的时区或语言,与服务器实际看到你连接抵达时所用的 IP 地址做比对。
- 正确的用法是逐项阅读结果;把整套测试排名或打成一个总分,会强加一种它从未打算提供的精确度。
一整套测试,而非一个分数
BrowserLeaks 这类工具在厂商综合分数面前显得七零八落,原因在于它们要解决的是不同的问题。综合分数把许多信号压缩成厂商自行决定权重的一个数字;测试套件恰恰相反——它有意让每个面保持独立,因为摄像头权限泄露、过期的 DNS 解析器、独特的 canvas 哈希值是三种毫不相干的失败模式,各自有各自的修复方式。把它们合并成一个等级,只会掩盖到底哪一项对你真正重要。
这意味着要读懂一套测试的输出,重点不在总分,而在于逐个面板地问两个问题:这项具体测试暴露了什么,它对我想保护的东西是否重要。下一节就按这个顺序,走一遍主要面板。
每个面板到底暴露了什么
IP 与 WebRTC。 WebRTC 面板检查的是:即使 VPN 处于开启状态,你浏览器那套为点对点视频、语音通话设计的实时通信栈,是否依然泄露了你的真实公网 IP。WebRTC 用 ICE 框架协商连接,这套框架会收集设备能被联通的每一条网络路径,包括 VPN 根本没有路由到的那些,并可能把整份清单交给任何发起请求的页面。WebRTC 泄露会摧毁大多数人使用 VPN 的核心目的——隐藏 IP。《WebRTC 泄露防护:VPN 用户的必修课》详细讲解了这种泄露如何发生,以及如何在不影响视频通话的前提下堵住它。
DNS。 DNS 面板检查的是:真正处理你域名查询的,到底是 VPN 的加密解析器,还是你 ISP 的解析器——后者会把你访问过的每一个主机名,泄露到你以为受保护的隧道之外。这项测试存在的意义在于:即便 VPN 正确路由了其他流量,也可能悄悄没能把 DNS 请求重定向,而这种失败在没有专门检测的情况下是不可见的。《DNS 泄露防护:隐藏你的浏览足迹》讲解了背后的机制,以及 DNS over HTTPS 如何堵住这个缺口。
Canvas。 canvas 面板会在一个隐藏的离屏 Canvas 元素上绘制文字与图形,再读取生成的像素并做哈希——这个值会因 GPU、驱动、操作系统、字体引擎而产生细微差异,且无需 cookie 就能在多次访问间保持稳定。这项测试告诉你的是这个哈希值是否被生成,以及它在多次刷新之间看起来有多稳定;它本身并不会告诉你,你这个特定哈希在其他访客中到底是常见还是罕见。《Canvas 指纹检测:网站如何识别你的设备》详细讲解了像素是如何产生差异的,以及为什么一些流行的防御手段反而会弄巧成拙。
WebGL。 WebGL 面板会直接查询你的图形硬件——GPU 厂商与渲染器字符串、支持的扩展、数值上限——还可能像 canvas 那样渲染一个 3D 场景并对输出做哈希。它检测的是这份硬件指纹是否被暴露、包含多少细节,而不是这种暴露本身是否危险。《WebGL 指纹深度解析:显卡也能暴露身份》有完整的技术细节。
字体。 字体面板会枚举或测量你系统上安装了哪些字体——这是一台常规浏览器仅凭特定操作系统、语言包、已安装应用的组合,就会暴露出的最独特信号之一。它报告的是能检测到什么,而不是这能把你从其他人中区分出多少。《字体指纹:已安装字体如何暴露你》讲解了枚举与测量这两种技术,以及为什么它们泄露的信息量不同。
TLS 与网络层。 TLS 面板看的层次比任何 JavaScript 能看到的都要低:它检查你的 TLS 客户端在握手过程中提供的密码套件、扩展、椭圆曲线的确切顺序与内容,并汇总成一个 JA3/JA4 风格的哈希值。这是唯一一个根本不读取浏览器 API 的面板——它读取的是你的 TLS 协议栈如何协商连接,这正是即便其他每一个信号都伪装得天衣无缝,它依然能把真实浏览器和脚本化的 HTTP 客户端区分开的原因。《TLS 指纹识别详解:JA3/JA4 如何识别你的客户端》拆解了握手过程里到底包含什么。
「暴露了什么」不等于「唯一性有多高」
以上每个面板回答的都是「这个信号是否暴露,它包含什么内容」。没有一个回答「所有这些信号组合在一起,让我有多容易被识别」。这是两个真正不同的问题,把它们混为一谈是解读泄露测试套件时最常见的误读:WebRTC 面板干净、DNS 面板也干净,并不能告诉你 canvas、字体、WebGL 这些信号组合在一起,是否已经罕见到足以在完全不依赖 cookie 的情况下,把你在多次会话之间追踪出来。
《浏览器指纹熵与匿名集详解》讲解了单个信号如何合并成一个唯一性数字——这正是一套按面板拆分的测试套件有意不去尝试的计算。而如果你曾经把一套泄露测试的结果,跟某个厂商给出的匿名度百分比放在一起对比,却发现很难调和,这也是意料之中的事,并不代表其中一个是错的:《指纹检测工具为何对你各执一词》讲清楚了暴露检测、唯一性评分、一致性检查其实是三种不同的度量,只是都被套上了「分数」这个词。
每一个浏览器端套件共有的盲区
前面讨论的每个面板都完全运行在你的浏览器内部,读取的是 JavaScript(对 TLS 而言则是客户端协议栈)能从内部看到的内容。这让它们都有着同样的结构性局限:浏览器里运行的任何东西,都无法知道你的网络连接实际在对端落在了哪里。Intl.DateTimeFormat().resolvedOptions().timeZone 报告的是浏览器被配置为声明的内容,而不是你的数据包实际走过的路由,也不是服务器实际看到连接抵达时所用的 IP。
把浏览器声称的时区、语言,与 IP 实际的地理位置做比对,能抓住一种具体且常见的失败:VPN 改变了你对外可见的 IP,却没有改动系统时钟和区域设置,结果浏览器内部看起来完全自洽,却与它自称所在的位置相矛盾。《时区与语言泄露:当浏览器与 IP 自相矛盾》详细讲解了这种错位是如何发生的,以及检测系统如何利用它。要堵上这个缺口,需要一台观察到连接实际到达的服务器——这一环节完全在任何只读取浏览器属性的测试之外,往一套测试里再加多少浏览器端面板,也无法把它暴露出来。
如何解读自己的测试结果
以上这些都不是在反对使用泄露测试套件——逐个面板独立检查,确实是找出某个具体、可修复暴露点(比如 VPN 漏掉的 WebRTC 泄露,或绕过隧道的 DNS 解析器)的正确方式。真正的误区在于,期待这一组面板加起来能给出一个关于你整体有多容易被追踪、有多安全的定论。
如果你想要的正是那种综合视角——把你的各项信号放在一起检查内部一致性,再加上浏览器端套件在结构上做不到的网络侧比对——可以同时运行 BrowserInsight 的指纹检测和 VPN 与代理检测。两者合起来覆盖了同样的底层信号面(指纹检测那边负责 canvas、WebGL、字体、TLS,VPN 检测那边负责 WebRTC 与 DNS),再加上时区与 IP 的比对,并且以一致性判定的形式呈现,而不是一组互不相关的面板。如果你只想看网络这一侧,IP 地址查询会显示服务器为你这条连接看到的地理位置、ISP 与 ASN。
常见问题
BrowserLeaks 这类测试每一项都「通过」,是不是就意味着我很匿名?
不是。每项测试只报告它自己这个具体面是否被暴露——WebRTC 和 DNS 结果都干净,只说明你的 VPN 在这两个通道上没有泄露。它并不能说明你的 canvas、WebGL、字体组合放在一起,是否已经罕见到足以在没有 cookie 的情况下把你跨次访问追踪出来。这是一个独立的唯一性问题,详见《浏览器指纹熵与匿名集详解》。
为什么 BrowserLeaks 不像有些工具那样给一个总分?
因为按面板拆分的测试套件本来就是为了逐一定位和诊断单个泄露点而设计,而不是去概括它们。给出一个综合分数需要决定每个信号该占多少权重,这是厂商的主观判断,而不是一种测量——具体这种判断如何在不同厂商之间千差万别,见《指纹检测工具为何对你各执一词》。
如果时间只够检查一项,哪一项最重要?
取决于你要保护的是什么。如果你依赖 VPN 来隐藏 IP,WebRTC 和 DNS 面板能抓住 VPN 在其他方面工作正常的情况下,最常见的两种泄露方式。如果你担心的是在不使用 cookie 的情况下被跨站追踪,那 canvas、WebGL、字体测试比前两者更重要。
浏览器端的测试套件能不能自己发现时区与 IP 不匹配的 VPN?
单靠它自己不行。这项比对需要服务器端观察到连接实际到达时所用的 IP,再拿它和浏览器报告的时区、区域设置做比对——这是任何纯运行在浏览器内的页面都看不到的东西。像专门的 VPN 与代理检测这类把浏览器检测和服务器端 IP 查询结合起来的工具可以做这种比对;只靠浏览器的泄露测试套件在结构上做不到。


