在网站检查的三件事里,隔离最不起眼,却是最多人栽在上面的一件,因为它失败的时候是看不见的:一切都很正常,直到两个本不该彼此知道的账号在同一天被一起处理。
问题所在
两个标签页之间会漏掉什么
浏览器环境就是磁盘上的一个目录,网站能写的一切都落在里面:Cookie、localStorage、IndexedDB、HTTP 缓存、Service Worker 注册、权限授予。同一个窗口里的两个标签页共享这一切,另开一个窗口也一样。网站不需要任何高明手段就能把它们对上——它只是读回自己第一次存下的那个标识。
常见的变通办法各自堵住一条通道,其余的照样敞着。无痕窗口拿到一份干净的 Cookie 存储,但所有无痕窗口共用同一份,而把它们全部关掉,你想留下的那个会话也就一并没了。容器类扩展把 Cookie 和存储分了区,却仍跑在同一个浏览器进程里,带着同一批已安装扩展和同一份硬件指纹。换第二个浏览器能换来第二个身份——然后第三个账号又要第三个浏览器。
环境
每个环境一个目录
在 Argus 里,隔离的单位是环境,而每个环境背后是它自己的用户数据目录。不是共享目录里的一个分区,而是会话启动时让 Chromium 指向的一棵独立目录树。每个会话都从自己的目录起步,别的会话里的东西一样都不会带过来。
- ✓每个环境一个专属的用户数据目录——存储、缓存和 Cookie 存储各自独立
既然边界是一个目录而不是一项设置,它就能像文件系统那样扩展。数百个彼此完全隔离的环境,每一个都有自己的存储、Cookie 和身份。 这份列表是按这个规模设计的,而不是为了几个标签页——文件夹、标签、搜索与筛选、批量启动与批量编辑,还有软删除:环境进回收站,而不是直接毁掉一个你也许还用得上的会话。
每个会话都在自己的目录里打开。
浏览器
上一次运行的东西一样都不会带过来
光有独立目录还不够,因为浏览器总想在“上次你是怎么用的”这件事上帮忙。恢复的标签页、找回的会话、崩溃处理程序留下的表单——每一样都是让上一次运行在新一次里冒出来的路径,也就让周二关掉的那个账号在周三和另一个账号并排开着。
- ✓会话恢复被关掉了,上一次运行不会在新的一次里冒出来
浏览器
代理施加在网络层
在所有环境共用一个出口 IP 的前提下隔离存储,只解决了一半问题。在 Argus 里,代理属于环境本身,并且施加在会话上,而不是通过某个页面能枚举并读取的代理切换扩展。
- ✓代理施加在网络层,而不是通过一个页面能察觉到的扩展
一个地址被启用之后还要扛住什么——健康检查、拒绝它的网站,以及检查失败时会发生什么——由代理在 Argus 里如何工作来讲。
浏览器
网站为识破自动化而探测的端口
有一种检测手法与存储毫无关系:页面让浏览器回连本机 localhost 上那些自动化框架和远程桌面工具常用的端口。普通访客的机器会拒绝连接;开着调试端口的机器则会应答,于是页面得知了任何指纹都不会告诉它的事。
- ✓默认的拦截名单盖住了那些站点用来识别自动化的远程访问端口
老实说
隔离解决不了什么
隔离能保证两个环境不共享任何状态。它并不能让它们看起来像两个不同的人,单靠它也留不住账号。
两个隔离得再彻底的环境,跑在同一台机器上,画出的 canvas 一样、报告的 GPU 一样、走的时钟也一样——设备这一半由指纹识别如何工作来讲。而且只要没给每个环境配上自己的代理,它们出去的还是同一个 IP。这三件事必须同时成立;只靠其中任何一件,都是一套一直好用、直到不好用的方案。

