浏览环境
给每个账号一个互相隔离的「浏览器」:Cookie、登录状态、网络出口、指纹都各用各的。
它要解决的问题
同时运营多个店铺、多个社交账号时,最容易出事的不是密码,而是被平台关联:同一台电脑、同一个出口 IP、同一份 Cookie,平台一眼就能看出这几个号是一个人。
浏览环境把这三样拆开:
| 隔离项 | 做法 |
|---|---|
| Cookie / 登录状态 / 本地存储 | 每个环境一个独立的数据目录,互相完全看不到 |
| 网络出口 | 每个环境可以固定走自己的代理,不受其他设置影响 |
| 浏览器指纹 | UA、语言、时区、CPU 核数、Canvas、音频、WebRTC 按环境各自设置(显卡型号保持真实) |
这不是「绝对不会被发现」
这些措施降低的是被自动关联的概率,不能保证任何平台都不会判定关联。真正容易翻车的往往是行为本身:同一个账号换着环境登录、同一份素材反复发。下面的防关联就是针对第二类。
默认环境与自建环境
| 默认环境 | 自建环境 | |
|---|---|---|
| 数据 | 沿用原来的内置浏览器,已有的登录不会丢 | 全新的独立数据目录 |
| 网络出口 | 跟随全局代理规则 | 固定出口 / 跟随全局规则 / 直连,三选一 |
| 指纹 | 不改,保持本机的真实值;但 UA 和品牌会改成 Chrome 的写法(见对网页隐藏内嵌浏览器特征) | 按环境配置指纹保护 |
| 能否删除 | 不能 | 可以 |
新建与切换
标签栏最左的环境按钮点开下拉:搜索环境、按分组浏览、新建、临时环境、管理。每个环境显示状态:运行中(有网页开着)、已休眠、未启动。
点一个环境就切过去。切换时当前环境的网页留在后台继续运行,不会重新加载;标签栏会淡淡染上当前环境的标识色,免得登错环境。
新建环境
默认一屏就够:
- 名称和颜色
- 网络出口:
- 固定出口:类型下拉选 HTTP 或 SOCKS5,填主机、端口,需要的话再填账号密码。可以直接粘贴整段地址(
socks5://用户:密码@主机:端口、主机:端口:用户:密码),会自动拆进各个框。 - 跟随全局规则:和默认环境用同一套代理规则。
- 直连:不经过任何代理,网站看到你的真实 IP,只隔离 Cookie 和登录状态。
- 固定出口:类型下拉选 HTTP 或 SOCKS5,填主机、端口,需要的话再填账号密码。可以直接粘贴整段地址(
- 指纹:默认已经是一套合理的自动配置,细项在「高级设置」里调
高级设置
| 项 | 说明 |
|---|---|
| 指纹 | 见下方指纹 |
| 分组 | 环境多了用来归类,下拉里按分组显示 |
| 起始页 | 打开这个环境时默认访问的网址 |
| 上游不可用时 | 固定出口连不上时:阻止访问(推荐)或改走直连 |
| 账号归属 | 把金库里的账号绑定到这个环境,见防关联 |
| 备注 | 随便记 |
为什么推荐「阻止访问」
固定出口的代理一旦掉线,如果悄悄改走直连,网站就看到了你的真实 IP——这恰恰是用环境想避免的事。宁可打不开,也不暴露。
代理的账号密码只存本机加密库,不以明文落盘,也会随主密钥一起轮换。
管理环境
标签栏环境下拉里点「管理」:列出所有自建环境及其状态、标签数、网络出口、绑定账号数、最近使用时间。
| 操作 | 说明 |
|---|---|
| 切换 | 切到该环境 |
| 编辑 | 改名字、出口、指纹等;改出口后正在运行的环境立即按新出口走 |
| 休眠 | 关掉它所有网页释放内存,登录状态保留,网址记着,切回来时重新加载。正在使用的环境不能休眠 |
| 删除 | 带二次确认:该环境的 Cookie、登录状态、本地存储一并永久删除,账号归属解除,无法恢复。删除当前环境会自动回到默认环境 |
内存
每个运行中的环境是一套独立的浏览器进程,通常占几百 MB 内存。环境下拉底部会显示「运行中 N 个环境 · 约 X」(不含 Sigil 界面本身,每次打开下拉时统计一次)。
Sigil 不限制同时运行的环境数,也不会自动休眠你的环境——挂着的下载、直播、没提交的表单被悄悄收掉,比多占点内存更糟。内存吃紧时自己把暂时不用的环境休眠即可。
临时环境
替代「无痕」:一个用完即焚的独立环境。
- 打开:环境下拉里点「临时环境」,或
Ctrl+Shift+N - 有自己独立的 Cookie 和数据目录,和其他环境互不可见
- 关掉最后一个标签,整个环境连同 Cookie、历史、缓存一起销毁;也可以从下拉里点环境旁的
×整体关闭 - 临时环境不开启指纹保护(核数、语言、时区等保持本机真实值),网络出口跟随全局代理规则;UA 与品牌同样会 Chrome 化
防关联:账号绑定到环境
最常见的关联方式是同一个账号在不同环境登录。所以可以把金库里的通用密码账号绑定到某个环境,一个账号只属于一个环境。
在另一个环境里碰到这个账号时:
- 打开它的站点或填充它的密码之前,先弹出提醒:「这个账号属于『美区店铺 A』」,说明在当前环境登录会让两个环境被关联。
- 你可以选「在『美区店铺 A』中打开」(直接切过去),也可以选「仍在当前环境打开 / 填充」——这是你明知风险后的决定。
- 即使绕过界面直接调用,填充也会被后端拒绝;只有你在提醒里明确选了「仍在当前环境填充」才放行,并在审计里留下记录:这条填充的详情里带
cross_env: true,事后能查到哪次是明知会关联还坚持填的。
没有绑定的账号不受影响,所有环境都能自由使用。绑定有账号的环境,新标签页上它们的站点排在最前。
出口所在地
地址栏右侧的胶囊会直接显示当前网页从哪儿出去,不用手动检测:
| 情况 | 胶囊显示 |
|---|---|
| 固定出口环境 | US Los Angeles(国家码 + 城市),新标签页上也显示 |
| 直连环境 | CN Zhanjiang(本机网络的出口) |
| 默认环境「按规则」 | 代理 · US Los Angeles 或 直连 · CN Zhanjiang —— 同一个环境里,不同网站可能一个走代理、一个直连,胶囊跟着当前网页变;新标签页上仍显示代理模式 |
| 固定出口连不上、设置为改走直连 | 直连(固定出口不可用)· …,黄色 |
| 固定出口没配好 | 出口不可用,红色(网页不会打开) |
- 胶囊里不显示 IP,免得截图时带出去。点开胶囊,在环境面板 / 代理面板的「当前网页的出口」里看详情:地区(国家 · 省州 · 城市)、IP、运营商与 AS 号、走代理还是直连(以及用的哪个上游)、延迟、多久前检测,可以「重新检测」。
- 去向按当前网页的域名判定,和网页真正连接时用的是同一套规则,所以「按规则」时显示的就是这个网页实际用的出口。
- 检测会沿这条路访问 Cloudflare(IP、国家、延迟)和 ipinfo.io(省州、城市、运营商),它们只会看到出口 IP,不涉及账号和页面内容。两边看到的 IP 对不上时(轮换出口的代理池),只显示国家,不拿另一个出口的城市充数。
- 结果按「走哪条路」缓存 10 分钟:同一条路上换网页不会重复检测。改了代理设置或环境出口会自动重新检测。
- 新建 / 编辑弹窗里也有「检测出口」,还没保存也能测,密码框留空时沿用已保存的密码。
- 检测不通会给出原因:代理没运行、地址或端口不对、账号密码被拒、超时。
切换前就知道各环境在哪
环境下拉和「环境管理」列表里,每个固定出口 / 直连的环境都标着出口所在地(例如 US Los Angeles),切换之前就能确认这个环境从哪个国家出去:
- 下拉一打开先显示上次的结果,再在后台补测没测过或已过期的环境。补测只走网络探测,不会为此启动环境的浏览器,休眠的环境照样休眠。
- 下拉里地点替换了原来的「HTTP · 127.0.0.1:7890」这行,鼠标悬停在上面还能看到出口设置;管理列表的「网络出口」列两样都显示。
- 按规则分流的环境没有固定出口(取决于打开哪个网站),照旧只显示出口设置。
疑似机房
出口 IP 属于云服务商或机房(AWS、Google Cloud、Vultr、DigitalOcean、阿里云、腾讯云等),会在地点后面标一个黄色的「疑似机房」,详情里多一行「类型」。
很多网站看到机房 IP 就直接判定为代理访问,跟指纹设置无关。需要家庭宽带类型的出口,可以换成住宅代理。这是按 AS 号和运营商名称做的粗判,只作参考:没标不代表一定是住宅 IP,标了也可能是误判。
指纹
自建环境的指纹在新建 / 编辑弹窗的「高级设置 → 指纹」里调,摘要会实时显示在卡片上。
| 项 | 做什么 | 默认 |
|---|---|---|
| 系统 | UA 呈现为 Windows 或 macOS 上的 Chrome,去掉 Edge / WebView2 品牌,Client Hints 一并改;大版本号跟本机引擎保持一致 | Windows |
| 语言 | 浏览器语言与 Accept-Language | 跟随出口 |
| 时区 | Date 与 Intl 的时区 | 跟随出口 |
| CPU 核数 | 对网页报告的核数,并按核数配套设备内存档位(2 / 4 / 8 GB) | 本机核数与 8 取小 |
| 封堵 WebRTC | 在浏览器层禁止不经代理的连接,网页无论怎么调用都拿不到你的真实 IP | 开 |
| 指纹加噪 | 给 Canvas、音频指纹加不可见的噪声;显卡型号不改 | 开 |
跟随出口
语言和时区选「跟随出口」时,打开网页前 Sigil 会先经这个环境的出口探测:
- 时区按出口 IP 所在城市取(例如出口在洛杉矶就是
America/Los_Angeles),和检测网站根据 IP 算出的时区一致。只按国家取会出问题:美国有 4 个主要时区,按国家一律用纽约时间,出口在洛杉矶时会被判定时区异常。城市级时区取不到时,退回该国的常用时区。 - 语言按出口国家取常用语言(覆盖 40 多个常见国家 / 地区)。
- 探测不到出口国家时,语言和时区保持本机,不会瞎猜。
- 出口变了(比如换了代理)但标签还开着,「当前网页的出口」里会提示「出口地区变了:当前标签的时区 / 语言是按『美国』定的,现在出口在『中国』」。关掉重开标签,新标签就会跟着新出口走。
WebRTC 为什么默认封堵
WebRTC 是浏览器的点对点通信,它会绕过 HTTP 代理走 UDP,把你的真实公网 IP 直接暴露给网页——哪怕你的网页流量明明走着代理。
封堵是在浏览器层做的(写进这个环境的浏览器配置,禁止不经代理的连接),不是在网页里拦截调用:网页里的拦截只挡得住正常调用,检测网站换个调用方式就能拿到真实 IP。我们实测过四种调用方式,封堵后都拿不到任何候选地址。
代价:网页里的视频通话、点对点传输这类功能多半会不可用。需要时在这个环境的指纹设置里关掉「封堵 WebRTC」;改动要等这个环境的网页全部关掉后重新打开才生效。
加噪怎么做的
- 噪声每个环境各不相同、同一环境内始终一致。两个环境的 Canvas、音频指纹不会撞,网站无法靠它们把环境关联起来;同一环境里重复读取结果相同,不会因为「每次不一样」反而显得可疑。
- Canvas 只改文字、曲线边缘的像素(和左右上下邻居颜色都不同的那些),纯色区域和直边一个像素都不动。检测网站常用的手法是画一块纯色再读回来比对,纯色被改过就认定在加噪。
- 只改最低位,肉眼看不出。
- 改写浏览器函数时不留痕迹:函数名、参数个数、
toString()显示的[native code]都和原生的一样,页面和 Worker 里都是。 - 加噪算法是定型的:同一个环境的 Canvas、音频指纹在 Sigil 升级后保持不变。否则每次升级,网站看到的都是「这个账号突然换了一台设备」。
为什么不改显卡型号
早期版本会按环境从常见型号里挑一块显卡报给网页(如 RTX 3060),结果在 PixelScan 上被判定指纹异常:网页还能通过 WebGPU 读到真实的显卡厂商和架构(比如 Intel 的 gen-12lp),两边对不上。WebGPU 这一层改不干净,所以现在显卡型号保持真实,WebGL 和 WebGPU 自然一致。环境之间仍然靠 Canvas、音频指纹区分。
对网页隐藏内嵌浏览器特征
下面这些对所有环境(默认、临时、自建)都生效,目的是让网页看到的和普通 Chrome 一致,不被识别成「内嵌浏览器」:
| 项 | 做法 |
|---|---|
| UA 与品牌 | 去掉 Edg/,请求头 sec-ch-ua 和页面里的 navigator.userAgentData 都只报 Chromium / Google Chrome,不再带 Microsoft Edge、Microsoft Edge WebView2。完整版本、平台版本、架构保持真实 |
| WebView2 宿主对象 | 页面读不到 window.chrome.webview,连属性名都查不到;chrome.loadTimes()、chrome.csi() 照常可用 |
| Tauri 全局标记 | ipc、isTauri、__TAURI_INTERNALS__、__TAURI_EVENT_PLUGIN_INTERNALS__ 根本不被创建(在新建标签时、打开网页之前就把 Tauri 注册的启动脚本移除) |
| 窗口外框高度 | window.outerHeight 比 innerHeight 高 87,和真实浏览器(带标签栏、地址栏)一致 |
这解决了一类很具体的问题:有的网站会用 chrome.webview.hostObjects 判断「是不是在自家桌面客户端里」,误判后整页空白,在这里打不开、外部浏览器却能打开。
默认环境和临时环境只做以上这些,不改核数、语言、时区、Canvas 这类真实值;如果这一步因故失败,Sigil 照常打开网页(和自建环境「指纹没生效就不加载」相反,因为默认环境本来就不开启指纹保护)。
登录弹窗与 iframe
- 登录弹窗:网页用
window.open开的带尺寸弹窗(第三方登录窗之类)和打开它的标签用同一套指纹、同一个出口,window.opener照常可用,登录结果能正常交回原页面。弹窗会跟着打开它的标签一起关闭(环境休眠、删除时同样),应用锁定时一并隐藏。自建环境的指纹没能用到弹窗上时,弹窗直接关闭,不会用真实指纹打开。 - 跨站 iframe:嵌在页面里的其他网站(验证码、支付框之类),以及它们自己起的 Worker,看到的值和页面一致。
指纹自检
状态卡片和代理面板里的「开始自检」会让当前网页读一遍它看到的你,约需 5 秒。结果分三块:
- 一句话结论:指纹保护正常(绿)/ 有几处需要留意(黄)/ 发现几个问题(红)。
- 两类检查,有问题时下面直接写怎么办:
- 真实 IP:网站能不能经 WebRTC 拿到你的真实 IP。按最坏情况测(先把连接策略改回「全部放行」再收集候选,模拟检测网站的绕过手法),不会误报「已封堵」。 泄露时提示去环境设置里打开「封堵 WebRTC」。
- 信息是否一致:网站从后台线程(Worker)读到的时区 / 语言 / 核数等和前台是否一致、画布指纹是否稳定、能不能看出这是嵌在软件里的浏览器。 如果当前网页自己改动了浏览器功能(例如百度系页面会改写
Function.prototype.toString),会提示「检测结果可能不准,换个普通网页再测」——Sigil 自己的改写不留这种痕迹。
- 网站看到的设备:系统和浏览器版本、语言、时区、CPU 核数和内存、显卡型号。
UA 原文、画布 / 音频特征码、后台线程读数、被改动的函数名收在「技术细节」里,默认折叠。特征码可以用来核对「两个环境确实不同」:不同环境的特征码不一样,网站就认不出是同一台电脑。
默认环境和临时环境不开启指纹保护,结论处会写「这个环境没有开启指纹保护,下面是网站看到的本机信息」,不按异常判定; 直连访问时网站本来就看得到你的 IP,只做灰色说明。只有当前网页走代理、却能经 WebRTC 拿到真实 IP 时才标黄提醒,建议新建一个浏览环境来打开这个网站。
修改后什么时候生效
保存指纹设置后,已经打开的标签仍然是旧指纹:关掉重开,或让环境休眠再唤醒才生效。其中语言还有一层限制:它是浏览器启动参数,同一个环境里只要还有网页开着,新标签沿用已定的值,等环境里的网页全部关掉再打开才按新语言运行。
已知限制
| 限制 | 说明 |
|---|---|
| 仅 Windows 生效 | 指纹保护依赖 WebView2 的调试协议,目前只在 Windows 版生效 |
| 弹窗里的第一个网页由 Sigil 重新打开 | 为了先把指纹用上,弹窗的第一次跳转会被拦下、打好指纹后再由 Sigil 打开同一个网址。少数用表单 POST 直接提交进弹窗的页面(个别支付 / 银行验证)会变成普通打开,提交的内容会丢;第一个网页的请求里也不带来源页(Referer) |
| 部分指纹面未处理 | 字体、屏幕尺寸与色深、媒体设备枚举等保持本机真实值 |
| macOS 预设只改到 UA 这一层 | 在 Windows 上选 macOS 预设,UA、Client Hints 是 macOS 的,但显卡(Direct3D11)、字体等仍是 Windows 的,检测网站能看出系统对不上。指纹设置里和本机系统不一致的预设会带警示图标,选中时也会提示;没有特别需要请用 Windows 预设 |
| 跨 iframe 读函数原文能看出改写 | 同一页面里直接读,被改写的函数和原生的一模一样;但从另一个 iframe 取它的 toString 来读,函数名会变成空的。专门这样做的反篡改检测能发现 |
| 像素级精确的网页可能有偏差 | 修图、取色这类依赖精确像素的网页,加噪可能带来 1 个色阶的误差,这时关掉「指纹加噪」 |
| 指纹应用失败不会放行 | 指纹没能生效时,Sigil 选择不加载网页并报错,而不是用真实指纹偷偷打开 |
| 做不到「完全无法识别」 | 常见的检测手段都已挡住(见下),但专门做反篡改检测的站点仍可能从我们补丁的细节(跨 iframe 读函数原文、报错堆栈)看出来,这是页面脚本层补丁的通病 |
| 和真实 Chrome 仍有的差异 | 语音列表只有 3 条(真实 Chrome 约 22 条,缺 Google 的语音);Notification.permission 是 denied(真实 Chrome 是 default);完整版本的补丁号由内置引擎决定,可能和你本机 Chrome 差几位。这几项要伪造数据才能抹平,伪造得不像反而更可疑,所以没做 |
| 默认环境的 WebRTC 不封堵 | 默认环境保持真实,会暴露公网 IP;需要封堵请用自建环境 |
| 机房 IP 会被认出是代理 | 检测网站按 IP 归属判断(如 PixelScan 显示「hosting」),这是出口 IP 的性质,软件改不了;需要更像真人请用住宅代理 |
实测过的检测站点
2026-10 实测(默认环境走全局代理,自建环境「美区店铺 A」固定出口在洛杉矶):
| 站点 | 默认环境 | 自建环境 |
|---|---|---|
bot.sannysoft.com | 全部通过:WebDriver 不存在、chrome 对象存在、UA 不含 Edge,Fingerprint Scanner 各项均为 ok | — |
| CreepJS | 0% headless、0% stealth;另有 25% like headless,原因未深究 | — |
| BrowserScan 机器人检测 | Normal:Webdriver、User-Agent、CDP、Navigator 全部通过 | — |
| PixelScan | 浏览器、指纹、机器人三项通过;时区判定异常(默认环境不改时区,本机是北京时间而出口在美国,属预期);「检测到代理」 | 浏览器(Chrome 154 on Windows)、地区(United States / Los Angeles)、指纹(通过)、机器人四项通过,WebRTC 不暴露真实 IP;只剩「检测到代理」(机房 IP) |
Cloudflare(nowsecure.nl) | 正常打开,没有被拦在挑战页前 | — |
| 自建测试页:带尺寸的登录弹窗 | 弹窗为 Chrome UA、不带 WebView2 品牌,与主页面一致 | 弹窗与主页面的 UA、品牌、时区、语言、核数、内存全部一致,无宿主标记,window.opener 回传正常 |
| 自建测试页:跨站 iframe 与其中的 Worker | — | iframe(另一个站点)和它起的 Worker 的 UA、品牌、时区、语言、核数、内存都与页面一致,无宿主标记 |
| Cloudflare Turnstile 官方演示页 | 显示成功。但它用的是 Cloudflare 的测试密钥,恒定放行,不能当作真实检测的证据 | — |
没有测过的
DataDome 没有官方公开的测试页,没有对它做过测试;真实的电商 / 票务类站点的防护强度各不相同,以上结果不能保证它们放行。
