privacy

Privacy 工具

一个网站从你的公网 IP、请求头和 JavaScript 可读的硬件信息里实际能学到什么——以及在把 HAR 文件、URL 和令牌交出去之前该怎么脱敏。

3 工具

§01 领域指南

三个观察者,三层数据

等到你的 JavaScript 开始运行,网站早已知道了很多。传输层已经把你出口所用的公网 IP 地址交给了它,而仅凭这个地址就能得到:宣告该前缀的 ASN、一个粗略的地理猜测、协商出来 的 HTTP 版本,以及客户端提供的 TLS 版本。这些都不是可选的,都不涉及 cookie,而路径上 每一个反向代理默认都会记下其中大部分。IP 地址查询工具 展示的正是你 自己的连接暴露了什么——IP、城市、地区、国家、ISP、ASN、时区、终结这次请求的边缘 PoP、 HTTP 协议和 TLS。

第二层是浏览器在请求头里主动交出来的东西:User-AgentAccept-LanguageAccept-EncodingReferer,以及 Sec-CH-UA-* 客户端提示。采集成本低,到处都在记 日志,而且——与网络层不同——它们是自述的,所以也极易伪造。第三层是脚本在页面加载后测出 来的:screen.widthdevicePixelRatioIntl.DateTimeFormat().resolvedOptions().timeZonenavigator.hardwareConcurrencynavigator.deviceMemorymaxTouchPoints,再加上来自 <canvas>、WebGL、AudioContext 和字体探测的渲染痕迹。 浏览器指纹测试 在本地读取这一层,细到一个 canvas 渲染签名。

真正重要的思维模型是:没有任何单个值需要是秘密的。你的时区是公开信息。指纹技术作用 在联合分布上——一个由 2^k 个用户中的一个所共有的值贡献 k 比特熵,而比特会累积,大约 33 比特就足以把一个人从 86 亿人里分出来。相关的信号相加小于各部分之和 (platform: MacIntel 和一个 Macintosh 的 user agent 几乎是同一个比特),所以公开 发表的逐属性数字从来不能简单相加。Panopticlick 测得 User-Agent 约 10.0 比特、 Accept 系列头 6.09、屏幕分辨率加色深 4.83、时区 3.04;而被大量引用的约 18.1 比特是 该研究中一整个指纹的平均值,主要由插件枚举(15.4 比特)和字体枚举(13.9 比特)撑 起来,而现代浏览器已经基本把这两条路关掉了——又因为请求头和屏幕这些值互相重叠,它们 组合起来也不可能超过那个整体指纹的平均值。后来在远大得多的人群上做的工作 (Gomez-Boix 等人,200 万份指纹)发现日常浏览器的唯一性更低。所以要记住的是机制而不是 某个目标数字:十几个平淡无奇的属性,就足以在完全没有 cookie 的情况下把一个回访者认出来。 有两个结论工程师常常想反:IP 地址是这套栈里最持久的标识符,同时也是最弱的位置信号之一; 以及熵是对称的,所以把某个值伪装成不常见的样子会让你容易被识别。一个声称是 iPhone 的 User-Agent,旁边是 3440×1440 的屏幕、16 个 CPU 核心和 maxTouchPoints: 0,那就是 一个只属于一个人的指纹。

信号一览

信号观察者大致熵稳定性
公网 IP网络层,JS 之前高,与 NAT 后的同伴共享随网络 / VPN 变化
ASN + 组织网络层,JS 之前约 5–10 比特按 ISP 稳定
Accept-Language请求头约 5–8 比特非常稳定
User-AgentSec-CH-UA-*请求头 + JS约 10 比特,正在缩小到浏览器更新前稳定
时区JS约 3–5 比特(约 400 个 IANA 时区)跟着你走,不跟着 IP 走
屏幕 + devicePixelRatioJS约 5–8 比特接上外接显示器就变
CPU 核心数(hardwareConcurrencyJS约 2–3 比特每台机器固定;是原始计数,未分桶(6、10、12、20 都常见)
设备内存(deviceMemoryJS约 1–2 比特固定;分桶为 0.25/0.5/1/2/4/8 GB 且上限封在 8
canvas 渲染JS约 8 比特按 GPU + 驱动非常稳定
WebGL renderer 字符串JS约 10 比特或更多非常稳定
字体枚举JS桌面端很高按安装环境稳定
cookie / localStorage ID服务器分配设计上就是唯一的直到用户清除它

这些数字是来自已发表人群研究的数量级估计,不是对你浏览器的测量:同一个信号在多样化人群 里值更多比特,在同质化人群里值更少。注意最后一行是用户唯一能删掉的标识符——它上面的每 一项都会在下次访问时重新生成。

随成果物一起流出去的东西

大多数真实泄露不是追踪造成的,而是一份被粘进工单的调试产物。

产物接收方得到什么承载它的字段
HAR 导出一个可用的会话,外加那个标签页能读到的每一个响应正文CookieSet-CookieAuthorizationx-api-key?token=postData.textcontent.text
工单里的一个 URL账号身份,以及在过期之前一直有效的访问权?session=?sig=X-Amz-Signature、装着哈希邮箱的追踪参数
bug 报告里的一个 JWT用户是谁、能做什么——不需要密钥就能读subemailtenantrolesexp
原始邮件头、.eml发信方真实路径和你的内部拓扑Received:from 主机、最初 IP)、X-Originating-IP、内部 by 主机名
工单里的一行日志用户真实 IP,连同设备型号和 OS 版本号X-Forwarded-Forremote_addrUser-Agent 里的型号标记(SM-G991BBuild/…
DevTools 截图当时打开的任何面板,而且是像素,任何密钥扫描器都抓不到Network → Response 正文,Application → Cookies 的 Value

什么问题用哪个工具

“我现在用的是哪个地址?”是唯一一个无法在本地回答的问题:只有远端端点才看得见你出口 所用的地址,这也是 IP 地址查询工具 要去查询 api.sitekits.dev 的原因 (元数据原样回显,什么都不存储)。ifconfig 给你的是一个局域网地址,不是你防火墙白名 单需要的那个。“一段脚本能读到这台机器的什么?”则是相反的情形,全程本地: 浏览器指纹测试 覆盖请求头、屏幕和硬件这几行,外加一个被截 断的 canvas 签名,但它不枚举字体、WebGL 或音频——请把它当作一个检查辅助工具,而不是唯 一性评分。当你手上只有日志里的一条 UA 字符串、没有活的浏览器时,改用 UserAgent 解析器

HTTP 头信息检查工具 来审计一个源站对你的隐私说了什么: Referrer-Policy 决定 URL 有多少会被转发给第三方,Set-Cookie 的各项标志决定被分配的 标识符能存活多久。取回是在服务端做的,所以你拿到的是源站原始响应头、没有浏览器噪声—— 只有头,从不含正文。

把上面那张表接到工具上:一份 HAR 导出在离开你的机器之前先过 HAR 文件清洗器——它会把匹配的头、查询串里的令牌和两侧的正文替换成 [REDACTED],并报告一共动了多少个值——然后在 HAR 文件查看器 里打开 脱敏后的副本,确认你需要的计时和状态码还在;这一对组合在 HAR 指南 里 有详述。粘贴之前先用 URL 解析器 展开一个可疑链接,用 JWT 解码器 解开抓到的令牌,看清你即将转发出去的究竟是哪些声明,并 把一段原始头块过一遍 邮件头分析器,看看你正要公开的那条 Received: 链。这四个都在页面内运行,什么都不上传。截图没有这个选项:请裁掉,因为打 马赛克不等于脱敏。更广义的令牌卫生放在 安全工具集/zh/for/security/ 下面。

落坑清单

把地理定位当成位置

city 字段是这个前缀注册在哪里。移动运营商会把整个大区落到同一条记录上,而一个数据 中心 ASN 携带住宅样式的城市,是一个值得去查的矛盾,而不是一个值得相信的结论。

只脱敏你看得见的字段

基于模式的脱敏比对的是一份固定的头名清单,以及参数名中包含 token|key|secret|password|passwd|pwd|auth|session|sig|signature 的那些。藏在 URL 路径段里的密钥(/v1/reset/9f3a…)或者用了自家命名风格的密钥会被漏掉。附上去之前先 扫一遍脱敏后的输出。

忘了 URL 本身就是数据

查询串会落进 Referer 头、CDN 访问日志、浏览器历史和分析管道。这就是签名 URL 要设过期 的原因,也是个人数据绝不该做查询参数的原因。粘贴之前先解析。

以为浏览器端的 HTTP 客户端是中立的

REST API 测试器 从你的浏览器直连你输入的那个 URL——路径上没有 sitekits 的服务器。对隐私是好事,但目标因此会看到你的真实 IP、你的 User-Agent,以及 你粘进头输入框里的任何凭证。端点不是你自己的时候,请用一个一次性令牌。

FAQ
除了一个大致的城市,我的 IP 地址还能告诉网站什么?
它主要标识的是一个网络,而不是一个人。前缀携带 ASN 和宣告它的组织,这才是把住宅宽带、移动运营商、企业出口、云区域和 VPN 服务商区分开来的依据,比城市字段可靠得多。连接本身还会补上任何脚本都不必主动交出的信息:协商出来的 HTTP 版本、客户端提供的 TLS 版本,以及终结这次请求的边缘 PoP。由于运营商级 NAT 把成千上万的用户放在同一个地址后面,一个 IP 标记的是一个人群而不是一个用户;真正有信息量的是矛盾之处,比如一个数据中心 ASN 却呈现出住宅样式的城市,或者 JavaScript 时区与该地址所暗示的国家不一致。IP 地址查询工具显示的就是任何服务器都能看到的那些字段。
用 VPN 能挡住浏览器指纹吗?
不能。VPN 只改变网络层——你的 canvas 渲染签名、屏幕几何、字体集合、时区和硬件计数都没变,所以一个回访者依旧可被认出。更糟的是,JavaScript 时区与从 IP 推出的国家不一致,本身就是一个可靠的 VPN 信号。
多少比特的熵能让一个浏览器变得唯一?
大约 33 比特就能从大约 86 亿人里锁定一个人,因为 2^33 约等于 8.6e9。一个由 2^k 个用户中的一个所共有的值贡献 k 比特,而相关的信号相加起来小于各部分之和。被大量引用的约 18.1 比特并不是“请求头加屏幕”的数字——它是 Panopticlick 对一整个指纹的平均值,主要由插件枚举(15.4 比特)和字体枚举(13.9 比特)撑起来,而现代浏览器已经基本关掉了这两条路。仅请求头和屏幕数据本身远低于这个值(User-Agent 约 10.0 比特,Accept 系列头 6.09,屏幕分辨率加色深 4.83),而且它们互相重叠,所以不能加总到那个数上。
我把一个 URL 粘进工单时,泄露了什么?
比它指向的那个页面多得多。查询串里可能带着会话 id、在过期之前一直有效的签名 URL 签名,以及装着哈希后邮箱的追踪参数——而它们会被复制进发往第三方的 Referer 头、CDN 访问日志、浏览器历史和分析管道。这个 URL 有多少会被转发出去,是由源站的 Referrer-Policy 决定的,不是由你决定的。粘贴之前先把链接展开看看,并且干脆不要把个人数据放进查询参数。
sitekits 的哪些工具会把我的数据发到服务器,哪些留在浏览器里?
几乎全都留在浏览器里——浏览器指纹测试、HAR 文件清洗器和查看器、JWT 解码器、URL 解析器、UserAgent 解析器、邮件头分析器以及每一个格式化和转换工具,都在本地解析你粘进去的东西,它从不离开这个页面。有三个会调用 api.sitekits.dev,因为答案只有从你机器之外才看得见:IP 地址查询工具(你出口所用的地址)、DNS 查询(域名)和 HTTP 头信息检查工具(URL)。这几个的输入只用于那一次查询、从不存储,而头信息检查工具只返回状态和响应头——它从不获取响应正文。REST API 测试器是唯一的外部情形:请求从你的浏览器直连你输入的 URL,路径上没有 sitekits 的服务器,所以看到你真实 IP 和你粘进去的任何凭证的是目标站点,不是本站。每个工具页面都带一个 local / server / external 标记,说明属于三者中的哪一种。