「隔离」这个词,被用来形容差别很大的几种分隔程度。第二个 Chrome 用户是隔离的,Firefox 的容器是隔离的,无痕窗口在一个小时内是隔离的,另一台电脑接另一条网络也是隔离的。只有最后一种,在网站能测量的每一个维度上都是隔离的,而它也是没人愿意为之付钱的那种。这篇列出网站识别一个浏览器所用的三层信号,说明各种工具分别隔开了哪一层,最后给出一份适用于「绝不能被关联」的账号的清单。
浏览器身份的三层
| 层 | 里面有什么 | 网站怎么读 | 清 Cookie 后还在吗 |
|---|---|---|---|
| 存储 | Cookie、本地存储、IndexedDB、缓存、Service Worker、保存的登录 | 每次请求随之发回,脚本可读 | 不在,清除的就是它 |
| 指纹 | User-Agent、Client Hints、屏幕、核心数、显卡、Canvas、字体、音频、时区、语言 | 首次加载页面时由脚本读取 | 在 |
| 网络 | HTTP IP、WebRTC 候选地址、由 IP 推出的位置 | 服务器直接看到,脚本也能收集 | 在 |
网站不需要三层齐全才能把两个账号连起来。两个账号 Cookie 不同、指纹相同、IP 相同,就是一个人拥有两个登录。三层之间还会互相交叉检查:指纹说是 macOS 而字体列表来自 Windows,或者时区和 IP 对不上,那是一个被改过的浏览器,而不是第二个浏览器。
浏览器多用户隔开了什么
Chrome 的多用户(以及其他 Chromium 浏览器里的同类功能)各自拥有独立的用户数据目录,也就是独立的 Cookie、存储、历史、扩展、保存的密码和设置。就存储这一层而言,这是完整的隔离,而且是永久的,不是按会话的。
它们共享的是所有来自机器和程序的东西。两个用户跑的是同一个程序、同一个操作系统、同一块显卡、同一套字体、同一块屏幕、同一个时钟、同一条网络。它们的指纹完全一样,IP 也完全一样。在网站眼里,这是一个浏览器配了两个 Cookie 罐子。
Firefox 的 Multi-Account Containers 做的是同一件事,只是粒度更细:同一个 Firefox 配置文件里,每个容器有自己的 Cookie 和存储,所以你可以在两个标签页里登录两个账号。指纹和网络在所有容器之间共享,这是设计使然;容器是为了把网站彼此隔开,不是为了让一个人看起来像两个人。
代理和 VPN 隔开了什么
代理改变的是经过它的流量的网络层。绑定到一个环境上,就给了那个环境自己的出口。VPN 改变的是整台机器的网络层,也就是说每个环境得到的是同一个新出口:它把你和家里的 IP 隔开了,却没有把环境彼此隔开。
两者都不碰指纹层。而网络层还有自己的一致性规则:WebRTC 候选地址要和 HTTP IP 一致,时区和语言要和两者都一致。WebRTC 那篇讲了这里最常见的翻车方式。
指纹浏览器隔开了什么
指纹浏览器按环境把三层全部隔开,还多做了一件其他工具做不到的事:让每个指纹内部自洽。声称是 Windows 的环境,就配 Windows 的字体、Windows 的显卡字符串和 Windows 的 Client Hints;绑定新加坡代理的环境,就配新加坡的时区和语言。隔离只有在每个环境同时看起来像一个真实、单一的浏览器时才有用,因为一个自相矛盾的指纹,在被拿去和别的指纹比较之前就已经被标记了。
两个环境需要两套指纹,每套指纹都要描述一台合理的机器。每次加载页面都随机化数值,两样都得不到:环境每次来访都像一台不同的设备,而且是一台不可能存在的设备。
隔离清单
对于绝不能被关联的账号,每一条都适用于每一个环境:
- 存储独立且持久。 各自的 Cookie、存储和缓存,会话之间保留,让账号看起来是回访用户,而不是每天换一台新设备。
- 指纹彼此不同。 Canvas、WebGL、音频、字体和硬件数值,与你运行的其他每个环境都不一样。
- 指纹内部一致。 操作系统、字体、显卡、Client Hints、
navigator.platform和屏幕描述同一类机器,浏览器版本是当前版本。 - 网络各归各。 一个环境一个代理,WebRTC 报告代理出口,IPv6 不从旁边漏出去。
- 位置信号一致。 时区、语言和地理位置与出口 IP 匹配。
- 行为不出环境。 永远不要「就这一次」在环境 A 登录账号 B;手机号、支付方式、恢复邮箱不跨环境复用;如果网站会查,也不要在同一台机器上同一秒钟用两个环境打开同一个网站。
- 扩展不出卖你。 所有环境都装同一套少见的扩展,本身就是一种指纹。扩展列表按环境配置,并保持精简。
怎么测试隔离
在每个环境里打开实验室。比较指纹标识、Canvas 与 WebGL 行、IP 与 WebRTC 行、时区行。每个环境都应得到不同的标识;来自同一台机器的那些行在环境之间不应相同;而在每个环境内部,位置相关的行应彼此一致。有任何一个测量行相同的两个环境,就共享了一条网站可以利用的关联。
比较你的两个环境
在你使用的每个环境里运行实验室。环境之间相同的行是关联,环境内部不一致的行是标记。
Mango Browser 怎么处理隔离
Mango 的每个环境都是完全独立的浏览器目录,Cookie、存储、缓存和扩展互不相通,每个环境的数据在会话之间保留。每个环境有一套为自洽而生成的指纹:Windows 或 macOS 上的 Chrome/Chromium 或 Firefox,User-Agent、Client Hints、字体、显卡渲染器和平台都跟随所选的操作系统。Canvas、音频和 client rects 的噪声按环境设定种子,数值在环境之间唯一,在每次绘制时相同。
网络隔离同样按环境。给环境绑定 HTTP、SOCKS5 或住宅代理;WebRTC 默认报告代理出口,时区、语言和地理位置可以跟随出口。模板和批量创建把同样的一致性一次应用到很多环境上,团队角色则让每个人只待在自己该用的环境里。