网站对你了解多少
所谓信号,就是网站无需征求许可就能读取的关于访客的任何信息:浏览器在正常浏览中主动交出的值、连接本身的属性,或者你很久以前设置好就忘了的偏好。单个信号叫不出你的名字,但合在一起,它们构成一幅足够细致的画像,能认出你、大致定位你,并猜出你喜欢怎样浏览。浏览器指纹测试把这幅画像写成一段话,让你在访问的最初一秒里,以网站看你的方式读一遍自己。本文逐层走过这段话——连接、设备、浏览器与安静的偏好——并以网站仍然看不到的东西收尾。它与VPN 泄漏与伪装检查相配,后者追问的是:这幅画像是否与你的 VPN 想讲的故事相符。
段落先行
打开任何现代网站,在你点击、滚动或敲下任何字符之前,页面已经拼好了一幅关于你的工作画像。它大致知道你似乎身在世界何处、你大概读什么语言、你手里拿的是哪类设备、屏幕有多大,以及你的配置看起来普通还是罕见。这一切都不需要许可弹窗、登录或 Cookie 横幅。它来自每个浏览器为抓取和渲染页面而进行的普通协商:连接本身、每个请求附带的标头,以及为让页面适应你的设备而存在的 JavaScript API。
指纹测试顶部的那段话,正是为了让这种拼装变得可见。它不展示一堆原始技术数值,而是写出一句你会认作对一个人的描述的话:某个人在某个城市、在某个网络上、用某类机器上的某个浏览器、偏好某种语言和外观。那句话中每个填好的值,都能向下追溯到它的信号来源,所以你不仅能核对结论是什么,还能核对它是怎样得出的。当某个值缺失时,段落会诚实地说明——而那种缺席,正如最后一节所解释的,本身就是信息。
如果没有哪个值是秘密,这为什么重要?因为关键在于组合。单是屏幕尺寸就描述了数百万人。屏幕尺寸加上 GPU 型号、时区、语言顺序、支持的编解码器列表和网络类型,人群就会急剧缩小。网站把这种组合用于正当工作——欺诈检查、防滥用、认出一次登录是否眼熟——广告商则用它在 Cookie 被清除后仍能认出回访者。在你能看到自己的组合之前,你无法评判任何一种用途,而这正是这个测试的目的。
你的连接说了什么
第一层是你的连接,它的标题是你的 IP 地址。你联系的每个服务器都能看到它,因为它需要知道把回复发到哪里。仅凭这一个地址,网站就能查出不少东西:来自商业数据库的近似地理位置、拥有该地址段的自治系统号(ASN)和组织,以及该地址属于家庭宽带、移动运营商、企业还是托管公司。最后这一区别本身就是信号——从数据中心网段来的访客,与从居民街道来的访客,读起来非常不同,欺诈系统会注意到。
对地理位置要谨慎看待:显示的城市是你网络出口的城市,不一定是你的城市。数据库把地址映射到运营商注册和路由它们的地方,所以移动网络、企业网关和乡村运营商常把人定位到几十甚至几百公里外,偶尔还会定位到错误的国家。测试通过询问不止一个追踪端点来改善这幅图,因为不同网络看到的出口可能不同——例如 CDN 的追踪可能揭示那个边缘网络实际观察到的地址,当代理、中继或分流隧道介入时,它可能不同。这些读数之间的差异不是错误;它们是你流量实际所走路径的地图。
连接还会报告自己的机制:保护它的 TLS 版本和协议,以及它走的是 IPv4 还是 IPv6。这一层正是 VPN 所移动的——也只有这一层。VPN 用它的出口地址替换网站看到的 IP 地址,于是城市、国家、ASN 和组织都变为 VPN 服务商的。它不会改变你的屏幕、字体、时区或语言列表。那种不匹配——连接声称在一个国家,而浏览器配置属于另一个——正是伪装检查要找的东西,也是为什么只改地址是比感觉上更弱的伪装。
你的设备与浏览器说了什么
第二层是设备和浏览器本身。最古老的信号是 user agent 字符串,即浏览器宣布其家族、版本和操作系统的横幅;现代 Chromium 浏览器正日益冻结该字符串,并把细节移入 User-Agent Client Hints,即网站可请求的型号、平台版本和架构等结构化值。它周围还有平台名称、报告为硬件并发数的逻辑处理器数量、近似的设备内存数值和最大触摸点数——单独看都平凡,合起来就是一幅关于你的机器类别与年代的素描。
图形与显示增加了长尾。你的屏幕几何——总尺寸、可用尺寸、色深和设备像素比——描述了你的显示器和缩放选择。WebGL 探测可以读出 GPU 厂商和渲染器字符串,它常直接点名具体的图形芯片或驱动家族。Canvas 渲染、音频处理和字体测量也类似:让浏览器画一个形状、渲染一段文字或枚举它能显示什么,硬件、驱动和已安装字体的微小差异就会产生可测量的不同结果。测试还会间接探测已安装字体、汇总媒体设备,以及浏览器能播放哪些音视频编解码器——每项都是一个小事实,合起来是一个几乎没有其他访客能完全共享的组合。
这都不需要什么奇异的访问权限。这些正是正当网站用来提供正确视频格式、挑选适合你窗口的布局、或避免提供你的系统无法运行的下载的同一批 API。这种双重用途正是让指纹难以靠立法消除的原因:你无法在不破坏普通适配的前提下移除这种能力。你能做的是了解自己的暴露程度。罕见的组合不是过错,但它确实意味着,清除 Cookie 对你的匿名性的帮助比你希望的要小——设备层无需任何存储状态,就能在下一次访问时重新认出同一台机器。
安静的偏好
第三层更安静:你的浏览器携带的偏好与设置。它报告你偏好浅色还是深色配色、你是否要求减少动态效果、你是否偏好减少数据用量或对比度调整,以及通过操作系统或浏览器设置作出的类似无障碍与外观选择。这些存在的目的是让网站尊重它们,而大多数人设置一次就再也不想它们——这正是它们足够稳定、能为指纹作贡献的原因。
语言与时间更响亮。浏览器发送一个有序的语言列表——不只是你的主语言,还有后备语言及其优先顺序——并暴露你的系统所设的时区,以及你的区域设置中日期和数字的格式。一个只有一个常见条目的语言列表并不起眼;而一个以罕见顺序排列的三种语言列表,再配上时区和日期格式,就接近签名了。它还会交叉核对连接层:浏览器设在一个地区、而 IP 地址声称在另一个,是旅行、远程办公,或 VPN 出口选在与机器本身不同的国家的经典迹象。
有些偏好本是作为隐私请求设计的。Do Not Track 及其继任者 Global Privacy Control 让浏览器表明你反对追踪或反对出售你的数据——而且 GPC 在某些司法辖区具有法律效力,这是 Do Not Track 从未有过的。实践中两者被遵守的程度参差不齐,而发送它们本身就是一种区分性信号,因为这样做的访客相对很少。同样的悖论贯穿这一层:Cookie 与存储的可用性、是否提供电池 API、隐含的键盘布局——设置与缺席同样在描述你,包括那些本意为保护你的设置。测试报告你的浏览器所说的,并对它保留的值保持沉默,所以你能看到两面。
网站仍然看不到什么
尽管有以上种种,界限与触及范围同样重要。没有许可弹窗,网站无法读取你的姓名、确切地址、年龄、联系人、文件、精确 GPS 位置、麦克风或摄像头。地理位置、设备访问和通知位于明确的浏览器许可之后是有原因的,而一个行为良好的测试——比如这个——只读取自由提供的内容,什么都不索求。如果某个随机页面声称仅凭你的指纹就知道你的名字,它要么在虚张声势,要么从别处买来了那条关联。
那个“别处”正是诚实的提醒。广告业对你的年龄、性别、收入和兴趣的自信猜测并不来自这些读数;它们来自在许多网站和应用之间拼接起来的行为——你搜索、观看、购买和停留的东西——被组装成画像并随时间附着到标识符上。指纹在那套经济中的角色更窄、更技术性:它帮助再次认出同一个浏览器,好让行为记录得以延续。把这两件事分开很重要,因为防御方法不同:行为受账户、同意和追踪规则管辖,而信号受你的浏览器选择揭示什么管辖。
这就是为什么缺失的信号值得尊重。当测试说“这个浏览器没有说”时,那是一项隐私功能在按预期工作,而浏览器在这里是故意有所不同的:基于 Chromium 的浏览器通常提供更多细节,而 Safari 和 Firefox 保留、粗化或随机化更多值,注重隐私的浏览器走得更远。缩短你的段落是可能的——下面的常见问题给出了实用步骤——但目标应该是知情的选择,而不是隐身,因为没有任何主流配置能诚实地交付隐身。至于配套测试本身如何处理它读取的数据,见隐私测试如何不保留数据:简短的版本是,你的画像是在你的浏览器中、为你而写的,读取它不应要求你信任我们保留一份副本。