浏览器指纹与环境检测:时区、语言、字体和 IP 对不上,各自暴露了什么
时区、语言、字体“对不上”,指的是浏览器上报的环境信息和你出口 IP 所在的地区互相矛盾。最常见的情况是:流量从代理出去,IP 定位在国外,但系统时区还是 Asia/Shanghai,语言列表第一位是 zh-CN,字体里有微软雅黑和苹方。这几项任何网页都能直接读到,它们是浏览器指纹的一部分,组合起来既能推断你大致在哪,也能看出网络出口和设备本身不在一个地方。
下面先列网站能读到的环境信息,再解释代理为什么会造成不一致,最后给出自查步骤。本文只讨论如何减少不必要的暴露,不讨论伪装环境,也不涉及绕过任何平台的风控或地区限制。
网站在浏览器里能读到哪些环境信息
下面这些接口都不需要用户授权,页面脚本一加载就能读:
| 类别 | 常见读取方式 | 能看出什么 |
|---|---|---|
| 时区 | Intl.DateTimeFormat().resolvedOptions().timeZone、new Date().getTimezoneOffset() | 系统设置的 IANA 时区名和 UTC 偏移 |
| 语言 | navigator.language、navigator.languages、请求头 Accept-Language | 浏览器界面语言和偏好语言的排序 |
| 区域格式 | Intl.NumberFormat、toLocaleDateString() | 日期、数字、货币的默认格式 |
| 字体 | 用 Canvas 或 CSS 测量文字宽高,逐个比对字体是否存在 | 装了哪些字体,间接反映操作系统和语言环境 |
| 硬件 | navigator.hardwareConcurrency、screen.width/height、devicePixelRatio、WebGL 渲染器字符串 | CPU 线程数、屏幕规格、显卡型号 |
| 自动化痕迹 | navigator.webdriver 等 | 浏览器是否被自动化工具控制 |
| 网络 | 出口 IP、WebRTC 候选地址、DNS 解析路径 | 网络在哪里出去、有没有走代理 |
单看每一项,信息量都不大。放在一起就是常说的浏览器指纹:维度一多,组合起来就足以把一台设备和大量其他设备区分开。
前六类信息来自设备,最后一类来自网络。代理只改变网络这一层,设备那一层原样不动,所以才会出现对不上。
为什么挂了代理,时区和语言还会和 IP 对不上
代理只换了出口,系统设置没变
无论是浏览器代理、系统代理还是全局 VPN,改变的都是数据包从哪里出去。时区是操作系统设置,语言是浏览器和系统设置,字体是本机安装的文件,这些都不经过网络,代理碰不到它们。
举个例子(假设场景):一台在上海使用的 Windows 电脑,出口切到美国西海岸的节点。网站看到的是:
- IP 地理库定位:美国加州;
- 时区:
Asia/Shanghai,UTC+8; - 语言:
zh-CN, zh, en; - 字体:存在“微软雅黑”“宋体”;
- 浏览器往返延迟明显高于从该 IP 本地访问应有的水平。
每一项都没错,只是它们讲了两个不同的地方。
分流和多出口让情况更复杂
很多人用的是分流规则:国内站点直连,国外站点走代理。这时同一个浏览器在不同网站面前呈现的 IP 不同,但设备信息是同一份。如果规则没有覆盖 WebRTC 的 UDP 流量或 DNS 查询,网页还可能看到第二个、第三个地址。分流的原理和常见坑见 分流(split tunneling),WebRTC 和 DNS 两类泄漏的区别见 DNS 泄漏与 WebRTC 泄漏。
每种不一致分别泄露了什么信息
| 不一致的项 | 典型表现 | 泄露的信息 | 严重程度 |
|---|---|---|---|
| IP 地区 vs 时区 | IP 在国外,时区 UTC+8 | 设备实际所在的时区,大致推出所在国家或地区 | 高,最容易被读到 |
| IP 地区 vs 语言 | IP 在日本,语言首选 zh-CN | 使用者的语言习惯;单独看不说明问题,海外华人也是这样 | 中 |
| IP 地区 vs 字体 | 出现大量中文字体 | 系统语言版本、是否装过中文输入法或办公软件 | 中 |
| 网页 IP vs WebRTC IP | 两个地址不同 | 未经代理的真实出口,甚至内网地址 | 高 |
| 网页 IP vs DNS 解析服务器 | DNS 走本地运营商 | 你所在的运营商和城市 | 高 |
| 浏览器往返 vs 出口 TCP 往返 | 两者相差很大 | 流量经过中转,出口不在设备附近 | 中 |
| 自动化标记 | webdriver 为真 | 浏览器被脚本控制 | 视场景而定 |
语言和字体对不上本身很正常。在国外生活的中文用户、用英文系统的国内开发者,都会出现 IP 和语言不一致的情况。真正说明问题的是时区、WebRTC 和 DNS 这几项,因为它们直接指向设备或网络的实际位置。
怎样用 cdnping /ip 自查浏览器环境
cdnping 的 IP 与环境检测 把上面这些项目放在同一页,按下面的顺序看即可。
第一步:在常用状态下测一次
保持你平时上网的状态(开不开代理都行,以平时为准),打开 /ip,等待各项检测跑完。页面会给出:
- 出口 IP 情报:11 个地理库投票定位并给出置信度,判断原生 IP 还是广播 IP、机房还是家宽;
- 大陆分流检测:读取网易、腾讯、抖音等国内 CDN 回传的客户端 IP,判断你处于“大陆分流 / 全局代理 / 国内直连”中的哪一种;
- DNS 泄漏、WebRTC 泄漏:列出网页之外还能看到的地址;
- 延迟特征:浏览器往返和 Cloudflare 测得的出口 TCP 往返对比;
- 时区语言字体、硬件指纹、自动化痕迹:即上一节表格里的设备侧信息。
这些指纹在本地计算,不上传。
第二步:隐藏 IP 后生成结果图
检测完成后可以生成一张带水印的结果图,方便留档或发给同事一起排查。生成前打开“隐藏 IP”,这样图片发到群里或工单里,不会顺带公开你的出口地址。改动任何设置之前先存一张,作为基线。
第三步:逐项对照
拿结果图和下面的检查表逐行对照:
[ ] 地理库定位的国家/地区,和时区推断的地区是否一致
[ ] 语言列表首位是否是你预期的语言
[ ] WebRTC 一栏是否只出现网页出口 IP(或为空)
[ ] DNS 解析服务器是否和出口 IP 在同一网络或同一地区
[ ] 大陆分流检测结果是否符合你的设置意图
[ ] 浏览器往返和出口 TCP 往返是否接近
[ ] 自动化痕迹是否为“未检测到”
有不一致不一定要处理。先问自己一个问题:这项信息被网站读到,对你是否有实际影响。
第四步:改动后再测一次
每改一项设置,重新打开 /ip,生成第二张结果图,和基线对比。一次只改一项,否则说不清是哪个改动起了作用。
怎样减少不必要的暴露
目标是让网站少拿到它本来不需要的信息,而不是把设备伪装成另一个地方。按优先级排:
- 先处理网络层泄漏。 WebRTC 和 DNS 泄漏暴露的是真实网络位置,优先级最高。按 DNS 泄漏与 WebRTC 泄漏 的说明处理,分流用户顺便检查规则是否覆盖了 UDP 和 DNS。
- 使用浏览器自带的指纹保护。部分浏览器的隐私模式或严格模式会对 Canvas、字体枚举、硬件信息做限制或统一化处理,例如 Tor Browser 的默认设置、Brave 的指纹保护、Firefox 增强型跟踪保护的严格模式。开启后网站拿到的往往是一组“很多人都一样”的值,可识别性下降。具体效果因版本而异,开启前后用 /ip 各测一次就知道。
- 少装用不到的字体。 字体列表是区分度较高的一项,开发者机器上常有大量设计、编程字体。清理不需要的字体能降低可识别性,也不影响日常使用。
- 分开浏览器配置。 工作、个人、调试分别用不同的浏览器配置文件,减少扩展和设置在不同场景之间串联。
- 不要指望改一项就解决问题。 指纹是组合特征,改动一项往往会产生新的不一致,反而更显眼。这也是本文不建议手动修改时区或语言去“对齐”IP 的原因。
访问 AI 服务或其他平台时,地区限制以服务方条款为准。环境检测用来了解自己暴露了什么,不是用来绕过平台规则,请遵守服务条款和当地法规。
网站拿到这些信息会用来做什么
如果你是网站开发者,也可以换个角度看这份清单。时区和语言常被用于本地化:按时区显示时间、按 Accept-Language 选择页面语言,这是合理的用途。指纹类信息则多用于反欺诈和风控。自己的产品要读取这些信息时,建议只取业务真正需要的字段,并在隐私政策里说明。cdnping 的 /ip 页面把指纹放在本地计算、不上传,也是出于同样的考虑。
如果你在国内调用海外 AI API,网络环境排查不只有隐私这一面,连接质量同样重要。可以在 首页在线测速 测一下到 15 个 AI 模型 API 的首次连接和往返时间,或者在 API 状态 看各家入口的实时探测结果。AGI Plan 是 cdnping 的商业合作方。如果你想用一个接口地址接入多家模型,AGI Plan(agiplan.dev)是一个兼容 OpenAI 和 Anthropic 接口格式的聚合网关,按月订阅、人民币结算,站方说明自己不是官方授权渠道,套餐见 agiplan.dev/pricing。
下一步可以做什么
- 打开 /ip,开启“隐藏 IP”,生成一张当前环境的结果图存档;
- 对照上面的检查表,把 WebRTC 和 DNS 两项先处理掉;
- 想了解出口 IP 的类型差异,读 原生 IP 与广播 IP;
- 检测方法和数据来源说明见 数据方法。