本检测如何工作
您的浏览器请求本页时,先于其他一切发送了一组请求头。我们的服务器捕获每一个,把名称转为小写、按字母排序,连同请求方法和连接使用的 HTTP 协议版本一起印在上方表格中。没有任何过滤,我们也不添加任何内容;表格就是到达我们时的请求。
含义已知的请求头在第三列附有说明。表明代理或工具的请求头会被标记,表格上方的摘要单独列出它们,因为对检查代理配置的人来说这些才是关键。同样的数据也以 JSON 提供,脚本或命令行客户端可以用易于比对的形式查看自己发送了什么。
本页刻意保持朴素。请求头是请求中唯一无法对服务器隐藏的部分,所以这份列表也是浏览器指纹的被动部分:网站不运行一行脚本就能从每次访问收集的信息。浏览器指纹测试对这组被动信息哈希,并与脚本收集的信号并列显示。
如何解读结果
按作用把行分组。
| 分组 | 请求头 | 透露的内容 |
|---|---|---|
| 身份 | user-agent、sec-ch-ua、sec-ch-ua-mobile、sec-ch-ua-platform、sec-ch-ua-full-version-list 及其他 sec-ch-* | 浏览器家族、版本和平台;User Agent 页面会解析它们 |
| 偏好 | accept、accept-language、accept-encoding | 内容类型、按偏好排序的语言列表、支持的压缩;语言列表在匿名度评分中与 IP 国家/地区比较 |
| 请求上下文 | host、referer、origin、sec-fetch-site、sec-fetch-mode、sec-fetch-dest、sec-fetch-user、upgrade-insecure-requests、priority | 您请求的网站、链接您到此的页面,以及浏览器如何分类该请求 |
| 连接 | connection、te、cache-control、pragma | 保活和缓存行为;多属 HTTP/1.1 时代 |
| 隐私信号 | dnt、sec-gpc | Do Not Track 和 Global Privacy Control 退出选项(如已启用);罕见,因而是区分特征 |
| 会话 | cookie | 仅本站的 Cookie |
| 代理 | via、x-forwarded-for、forwarded、x-real-ip、client-ip、x-proxy-id、proxy-connection、x-forwarded | 由代理软件添加;部分携带您的原始 IP |
| 边缘 | cf-connecting-ip 及类似 | 由网站前面的 CDN 或边缘网络添加;显示边缘看到的地址 |
代理行是需要处理的。 浏览器从不发送它们。出现任何一个,就说明浏览器与我们服务器之间有东西插入了它们。X-Forwarded-For、Forwarded、X-Real-IP 和 Client-IP 通常包含代理所转发客户端的地址,也就是您的真实地址;把它与代理检测显示的 IP 比较,若不同,您的真实地址正被交给您访问的每个网站。Via 和 X-Proxy-ID 不携带您的地址,但宣告代理的存在,严格的网站把这当作信号。存在任何一个时匿名度评分扣 10 分。
Referer 和 Origin 告诉网站您从哪里来。在地址栏直接输入的新访问没有 referer;从另一个网站点击链接会发送该网站的地址,按来源网站的策略裁剪。Sec-Fetch-Site 说明请求是同源、同站、跨站还是用户发起,网站用它检测嵌入和跨站请求。
Accept-Language 比看起来更能说明问题。它按偏好顺序列出您配置的语言及地区变体。以 IP 所在国家/地区不常见的语言开头的列表是弱不一致;英语在前处处可接受。该值也是指纹输入,因为精确的列表和顺序因人而异。
Client Hints 只出现在 Chromium 浏览器中。低熵的品牌、移动标记和平台随每个请求发送。完整版本列表、架构、位数和型号等高熵项只在网站于先前响应中请求后才发送,所以这里看到的是默认集合。
Do Not Track 和 Global Privacy Control 很少有网站遵守,而且因为启用的人少,它们的存在让浏览器稍微更独特。这不是反对它们的理由,只是读指纹时该知道的事实。
如何修复
存在代理请求头
- 找出来源。如果您在浏览器或系统中设置了代理,就是那个代理。如果什么都没设却看到 Via 或 X-Forwarded-For,说明运营商或网络运行着透明代理或缓存,移动运营商和办公室常见。
- 对于您控制的代理,切换到不添加请求头的模式,常叫高匿。对于商业代理,向服务商索取高匿端口或另一个地址池;该行为按代理而非按浏览器决定。
- 对于运营商的透明代理,VPN 是绕过的办法:隧道把您的请求带过代理,代理只看到加密流量。
- 刷新本页。代理摘要应显示无,匿名度评分中的代理行应通过。
与配置其余部分矛盾的请求头
- user agent 写一个平台而 sec-ch-ua-platform 写另一个,说明扩展或配置文件在改写其中之一。移除覆盖,或使用同时设置两者的配置文件。
- 与 IP 国家/地区不符的 Accept-Language 在浏览器语言设置中修复:Chrome 和 Edge 在设置 → 语言;Firefox 在设置 → 常规 → 语言;Safari 遵循系统设置中的系统语言列表。
Referer 暴露
- 要停止把来源页面发给其他网站,把浏览器的 referrer 策略设为 strict-origin-when-cross-origin(当前浏览器默认如此),或通过扩展或 Firefox 的 about:config 中的 network.http.referer 设置设为 no-referrer。站长可以为自己的外链设置 Referrer-Policy 响应头。
面向开发者和脚本
- 用您的工具请求本页的 JSON 版本,精确查看它发送哪些请求头。自称浏览器 user agent 却不发送 Accept-Language、Sec-Fetch 请求头和 Client Hints 的脚本,网站很容易把它与浏览器区分开。
- 用客户端选项显式添加请求头(例如 curl 的 -H 参数),并比较前后的 JSON 输出。
本检测的局限
- 我们只能看到到达我们服务器的内容。 网站前面的 CDN 或边缘网络可能在网站看到之前去除、改写或添加请求头。这里看到的是没有这一层的源服务器视角,最完整,但不一定是某个网站得到的。
- 仅请求头。 服务器返回的响应头不属于请求,不显示;浏览器的开发者工具两者都显示。
- Cookie 按站点隔离。 只出现本站设置的 Cookie,首次访问时没有。这一行无法告诉您其他网站持有什么 Cookie。
- 请求头顺序丢失。 我们按字母排序以便阅读。有些指纹系统把请求头的原始顺序当作信号,它因浏览器而异;这里不复现该顺序。
- 加密传输对网络隐藏请求头,对服务器则不。 HTTPS 防止路径上的任何人读取这些请求头,不防止您访问的网站读取,而这正是本页的意义。
- 代理检测基于请求头。 不添加请求头的代理对本检测不可见;其地址的网络类型由代理检测和 IP 检测覆盖。
透明代理请求头泄露是什么样子
透明代理位于您与互联网之间,用自己的地址转发您的请求,再把您的原始地址写入 X-Forwarded-For 或 Forwarded,使目标仍能记录是谁在请求。目标看到两个地址:作为连接来源的代理地址,和请求头中的您的地址。对运营商的缓存代理来说这是无害的记账。对您为改变表面位置而购买的代理来说这完全违背了目的,因为谨慎的网站首先读的就是那个请求头。代理请求头术语条目列出每个请求头、谁添加它以及携带什么值。
为什么不同浏览器的请求头列表不同
每个浏览器引擎有自己的默认值:列出哪些 Accept 类型、是否发送 Client Hints、包含哪些 Sec-Fetch 请求头、如何格式化 Accept-Language、是否在 HTTP/2 或 HTTP/3 上发送 priority 请求头。版本更迭会改变这些。差异大到服务器通常仅凭请求头集合就能说出浏览器家族,即使去掉 user agent。这就是只改写 user agent 不足以看起来像另一个浏览器的原因,也是浏览器指纹页面把被动指纹与脚本收集的指纹分开哈希的原因。
从脚本或命令行读取请求头
如果您维护抓取程序、监控工具或集成,本页的 JSON 输出是查看自己发送内容的最快方式。让工具带 application/json 的 Accept 请求头访问本页,把结果与浏览器发送的比较:浏览器以可识别的模式发送十几个请求头,裸客户端只发两三个。以“看起来像浏览器”为准入条件的网站检查的正是这一差异。诚实的工具与其不完整地模仿浏览器,不如清楚表明身份并遵守频率限制。