Privacy 工具
一个网站从你的公网 IP、请求头和 JavaScript 可读的硬件信息里实际能学到什么——以及在把 HAR 文件、URL 和令牌交出去之前该怎么脱敏。
3 工具
三个观察者,三层数据
等到你的 JavaScript 开始运行,网站早已知道了很多。传输层已经把你出口所用的公网 IP 地址交给了它,而仅凭这个地址就能得到:宣告该前缀的 ASN、一个粗略的地理猜测、协商出来 的 HTTP 版本,以及客户端提供的 TLS 版本。这些都不是可选的,都不涉及 cookie,而路径上 每一个反向代理默认都会记下其中大部分。IP 地址查询工具 展示的正是你 自己的连接暴露了什么——IP、城市、地区、国家、ISP、ASN、时区、终结这次请求的边缘 PoP、 HTTP 协议和 TLS。
第二层是浏览器在请求头里主动交出来的东西:User-Agent、Accept-Language、
Accept-Encoding、Referer,以及 Sec-CH-UA-* 客户端提示。采集成本低,到处都在记
日志,而且——与网络层不同——它们是自述的,所以也极易伪造。第三层是脚本在页面加载后测出
来的:screen.width 和 devicePixelRatio、
Intl.DateTimeFormat().resolvedOptions().timeZone、
navigator.hardwareConcurrency、navigator.deviceMemory、maxTouchPoints,再加上来自
<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-Agent、Sec-CH-UA-* | 请求头 + JS | 约 10 比特,正在缩小 | 到浏览器更新前稳定 |
| 时区 | JS | 约 3–5 比特(约 400 个 IANA 时区) | 跟着你走,不跟着 IP 走 |
屏幕 + devicePixelRatio | JS | 约 5–8 比特 | 接上外接显示器就变 |
CPU 核心数(hardwareConcurrency) | JS | 约 2–3 比特 | 每台机器固定;是原始计数,未分桶(6、10、12、20 都常见) |
设备内存(deviceMemory) | JS | 约 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 导出 | 一个可用的会话,外加那个标签页能读到的每一个响应正文 | Cookie、Set-Cookie、Authorization、x-api-key、?token=、postData.text、content.text |
| 工单里的一个 URL | 账号身份,以及在过期之前一直有效的访问权 | ?session=、?sig=、X-Amz-Signature、装着哈希邮箱的追踪参数 |
| bug 报告里的一个 JWT | 用户是谁、能做什么——不需要密钥就能读 | sub、email、tenant、roles、exp |
原始邮件头、.eml | 发信方真实路径和你的内部拓扑 | Received:(from 主机、最初 IP)、X-Originating-IP、内部 by 主机名 |
| 工单里的一行日志 | 用户真实 IP,连同设备型号和 OS 版本号 | X-Forwarded-For、remote_addr、User-Agent 里的型号标记(SM-G991B、Build/…) |
| 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,以及
你粘进头输入框里的任何凭证。端点不是你自己的时候,请用一个一次性令牌。