打开一个无痕窗口,访问一个指纹检测页,再和普通窗口的结果对比一下。哈希一样,显卡一样,字体一样,屏幕、时区、IP 全都一样。无痕模式改变的是浏览器记住什么,不是浏览器是什么。这篇把两者之间的界线画清楚,并说明如果你靠无痕窗口来区分账号,意味着什么。
无痕模式到底做了什么
Chrome 自己的描述很准确:无痕窗口不保存浏览历史、Cookie 和网站数据、表单里输入的信息;关闭最后一个无痕窗口时,会清除期间收集的 Cookie 和网站数据。扩展默认关闭,除非你允许。下载的文件和书签会保留。
这是一段关于存储的说明。在无痕窗口里,网站照样可以设置 Cookie、使用本地存储,只是它们放在一个临时罐子里,会话结束时倒掉。会话期间,网站看到的是一个没有历史的新访客;会话结束,罐子就没了。这份清单里没有一项涉及构成指纹的那些信号。
它一点没动的东西
| 信号 | 普通窗口 | 无痕窗口 | 原因 |
|---|---|---|---|
| User-Agent 与 Client Hints | macOS 上的 Chrome 152 | macOS 上的 Chrome 152 | 同一个程序,同一个系统 |
| 屏幕、核心数、内存 | 2560×1440、10、8 GB | 相同 | 同一台硬件 |
| Canvas 与 WebGL | 哈希 A、Apple M2 | 哈希 A、Apple M2 | 同一块显卡、驱动和渲染器 |
| 字体 | 你安装的那套 | 相同 | 从操作系统读取 |
| 时区与语言 | Asia/Shanghai、zh-CN | 相同 | 从操作系统读取 |
| IP 与 WebRTC | 你的网络 | 相同 | 同一条网络路径 |
| Cookie 与存储 | 持久 | 临时 | 唯一的区别 |
除了最后一行,每一行都完全相同。在两个窗口里打开实验室,会得到同一个指纹标识,因为标识是用那些不变的行算出来的。
真正变了的那一点,以及它为什么帮不上忙
无痕并不隐形。网站花了很多年寻找辨认无痕窗口的办法,因为设了付费墙的媒体想阻止读者靠无痕重置免费阅读次数。手段一直在换(早期基于文件系统 API 的方法在 Chrome 76 被堵上,之后又出现了基于存储配额的方法),但规律很稳定:无痕窗口的行为和普通窗口有细微差异,脚本测得出来。
所以无痕真正改变的那一样东西,是一个「此人打开了无痕窗口」的标记。配上一个没变的指纹和一个没变的 IP,这不是一个新身份,而是同一个身份,外加一个「正在试图看起来像新身份」的标签。
靠指纹做记录的网站,在页面加载的一瞬间就认出这个无痕窗口是同一个浏览器。空的 Cookie 罐子只能告诉它:你清掉了,或者从没保留过它的 Cookie。
两分钟的实验
- 在普通窗口打开实验室,记下指纹标识和 Canvas 哈希。
- 打开一个无痕窗口,再次加载实验室。
- 对比。标识、Canvas 与 WebGL 行、字体行和网络行都会一致。
- 现在在普通窗口清除 Cookie 并刷新。标识依然一致,因为它的输入里根本没有 Cookie。
看看有无痕和没有无痕时的指纹
在两个窗口里分别运行实验室。那些一致的行,就是网站不靠 Cookie 也能认出你的依据。
那么,真正区分两个身份的是什么?
三样东西必须同时不同,而无痕只在一次会话的长度内给你其中一样:
- 存储。 Cookie、本地存储、IndexedDB、缓存和 Service Worker。无痕临时隔离它们;独立的浏览器环境永久隔离它们。
- 指纹。 User-Agent、Client Hints、屏幕、显卡、Canvas、字体、时区、语言。无痕一样都没改。第二个身份需要第二套内部一致的指纹。
- 网络。 IP 和 WebRTC。无痕两样都没改。第二个身份需要自己的出口,而且 WebRTC 要和出口一致。
两个账号只要共享三者之一,就可以被关联;三者全部共享、其中一个还在无痕窗口里,那就是同一个账号外加一个标记。完整的清单见浏览器环境隔离。
什么时候无痕是对的工具
它很适合它被设计出来的用途:借用别人的电脑、不受个性化影响地查一个价格、在自己电脑上登录第二个账号五分钟、不让某次搜索进入历史记录。这些场景要的正是那个临时罐子,指纹没变也无所谓。
它不适合运营绝不能被关联的账号,原因就是上面那条:风控系统用来关联它们的每一个信号都原封不动。
Mango Browser 怎么处理
Mango 从无痕停下的地方开始。每个环境都是完全独立的浏览器目录,Cookie、存储、缓存和扩展在环境之间互不相通,而且会话之间持久保存,不会在关窗时消失。每个环境还带着自己的指纹:一个只属于该环境、但每次绘制都相同的 Canvas 种子,一个从该环境操作系统的真实显卡池中选出的 WebGL 渲染器,一份属于该系统的字体列表,以及描述同一个浏览器的 User-Agent 与 Client Hints。
给环境绑定代理,网络故事也跟着走:HTTP IP、WebRTC 候选地址、时区和语言都描述那个出口。在两个 Mango 环境里分别打开实验室,会得到两个不同的标识,这是无痕模式永远给不了的结果。