浏览器指纹是什么:网站不靠 Cookie 认出你的几类特征与自查方法
浏览器指纹,是网页在你不知情的情况下读取的一组设备和软件特征:系统和浏览器版本、屏幕尺寸、时区语言、已装字体、显卡渲染结果等。单看每一项都很普通,组合起来却可能足够独特,让网站在你清掉 Cookie、换了无痕窗口之后,仍然大致认得出是同一台设备。想知道自己暴露了什么,可以打开 cdnping 的 IP 与环境检测,它在本地算出各项指纹,再对照本文逐项看。
浏览器指纹和 Cookie 有什么不同?
Cookie 是网站写进你浏览器的一段标识,下次访问时浏览器把它带回去。它的特点是:存在你本地,你能看到、能删、能拦。
指纹不写任何东西,而是网站每次现场读取你浏览器的特征,再算出一个哈希值。两者的差异可以这样对照:
| 对比项 | Cookie | 浏览器指纹 |
|---|---|---|
| 存在哪里 | 你的浏览器里 | 不存储,每次重新计算 |
| 用户能否删除 | 能,清除站点数据即可 | 没有可删的东西 |
| 无痕模式是否有效 | 有效,窗口关闭即清空 | 基本无效,硬件和系统没变 |
| 稳定性 | 删除前一直不变 | 浏览器升级、换显示器、装字体后会变化 |
| 常见用途 | 登录态、购物车、偏好设置 | 风控、反欺诈、跨站追踪 |
所以指纹不一定都是“追踪”。银行和登录系统也用它判断“这次登录是不是在一台陌生设备上”。问题在于,同一套技术也可以在你不同意的情况下,把你在不同网站上的访问串起来。
网站能读到哪些指纹?按五类来看
区分度指的是这一项能把人群切得多细。区分度低的项单独没意义,但多项叠加后,可识别性会明显上升。
第一类:UA 与操作系统
- 读取方式:HTTP 请求头里的
User-Agent、Accept-Language;JavaScript 的navigator.userAgent、navigator.platform;Chromium 系浏览器还有navigator.userAgentData(Client Hints)。 - 区分度:中等。主流浏览器加主流系统的组合人数很多,但小众版本、少见的系统组合会立刻显得突出。
- 能否改变:UA 字符串可以改,但网站还能通过别的特征推断系统和内核。cdnping /ip 的“内核版本反推”就是用 23 项浏览器特征反推实际内核版本,再和 UA 声称的版本对比。改了 UA 却没改其他特征,反而形成一处不一致。
第二类:屏幕与硬件
- 读取方式:
screen.width/height、devicePixelRatio、色深;navigator.hardwareConcurrency(CPU 逻辑核心数);部分浏览器提供navigator.deviceMemory(内存档位);触控点数maxTouchPoints。 - 区分度:中到高。分辨率加缩放比例加核心数,能把常见笔记本、外接显示器、高配台式机分得比较开。
- 能否改变:硬件本身改不了。浏览器窗口大小每次都可能不同,所以部分隐私方案会把窗口尺寸取整,减少这一项的信息量。
第三类:时区、语言与字体
- 读取方式:
Intl.DateTimeFormat().resolvedOptions().timeZone、new Date().getTimezoneOffset();navigator.language和navigator.languages;字体通过测量一段文字在不同字体下的渲染宽度来探测,或用document.fonts检查。 - 区分度:字体最高。装过设计软件、办公套件、开发工具的人,字体列表往往差别很大。时区和语言在同一地区内区分度低。
- 能否改变:语言和时区能在系统里改,字体可以卸载。这一类和 IP 的关系最紧:时区、语言和出口 IP 的地区对不上时,网站会注意到这一点。具体会暴露什么,可以看 浏览器指纹与环境检测:时区、语言、字体和 IP 对不上,各自暴露了什么。
第四类:Canvas、WebGL 与音频渲染
这是区分度最高、普通用户最难感知的一类。
- Canvas:网页在一块看不见的画布上画文字和图形,再用
toDataURL()读出像素。不同显卡、驱动、系统字体渲染和抗锯齿设置,会让结果有细微差异。 - WebGL:通过
WEBGL_debug_renderer_info扩展可以读到显卡厂商和型号字符串;再渲染一个 3D 场景取哈希,差异来自 GPU 与驱动。 - 音频:用
OfflineAudioContext生成一段信号并处理,输出的浮点数会因音频栈实现不同而略有差别。 - 区分度:高。
- 能否改变:用户几乎改不了,除非换硬件或驱动。可行的做法是由浏览器统一返回结果,或者每次加入随机噪声,后面会讲。
第五类:自动化痕迹
- 读取方式:
navigator.webdriver是否为 true;是否存在无头浏览器特有的属性或缺失某些插件;窗口尺寸与屏幕尺寸关系是否异常;鼠标、键盘事件的节奏。 - 区分度:这一项不是用来区分个人,而是区分“人还是脚本”。
- 能否改变:普通用户一般不会命中。如果你用 Selenium、Playwright 做过测试,留在本机的配置有时会让日常浏览器也带上痕迹,可以用 /ip 确认一下。
用 cdnping /ip 自查:一份可以照做的步骤
/ip 的指纹检测在浏览器本地计算,不上传;生成结果图时可以选择隐藏 IP。建议按下面的顺序看:
- 用平时最常用的浏览器打开 /ip,不要开无痕,先看日常状态。等各项检测跑完。
- 看出口 IP 的地区和类型,记下 IP 所在国家和时区。机房 IP 和家宽 IP 的差别见 机房 IP 和家宽 IP 有什么区别。
- 对照“时区语言字体”:浏览器时区、系统语言和 IP 所在地是否一致。不一致不一定是问题,例如出差、使用公司网络,但你应该知道它存在。
- 看“硬件指纹”:核心数、屏幕、显卡字符串是否和你的真实设备相符。显卡字符串显示为通用名称,通常说明浏览器做了统一处理。
- 看“内核版本反推”:反推出的内核版本是否与 UA 一致。不一致多半来自 UA 修改扩展。
- 看“自动化痕迹”:日常浏览器应当全部为否。
- 顺手看 WebRTC 和 DNS 泄漏:它们不算指纹,但同样会暴露真实网络信息。原理见 DNS 泄漏与 WebRTC 泄漏,各浏览器的关法见 WebRTC 泄漏怎么关。
- 换一个浏览器或打开无痕窗口再测一次,对比哪些项变了、哪些没变。没变的项,就是清 Cookie 也带不走的部分。
/ip 页面上每一项检测结果怎么读,可以对照 浏览器环境检测怎么看:13 项检测逐项解读。各项的计算口径公开在 数据方法。
自查结果怎么判断?
| 你看到的情况 | 可能的原因 | 要不要处理 |
|---|---|---|
| 时区与 IP 地区不一致 | 用了代理或公司网络,系统时区未变 | 了解即可;涉及具体服务时遵守其条款 |
| UA 版本与反推内核不一致 | 装了改 UA 的扩展 | 不需要时建议卸载,它反而增加特殊性 |
| 字体数量明显偏多 | 装过设计、排版、开发软件 | 隐私敏感时可用单独的浏览器配置 |
navigator.webdriver 为真 | 测试框架残留、启动参数 | 检查启动方式和扩展 |
| 显卡显示为通用名称 | 浏览器开启了指纹保护 | 正常 |
想降低可识别性,该怎么做?
这里的目标是出于隐私,减少被跨站追踪的可能,不是伪装成别人,也不是绕过网站的风控或地区限制。各平台的风控规则和服务条款仍然要遵守。
原则:变得“普通”比变得“随机”更有效
指纹识别靠的是“少见”。一台装了十几个小众扩展、改了 UA、自定义了一堆字体的浏览器,比一台默认设置的浏览器更好认。所以第一步通常是做减法:
- 卸载不用的扩展,尤其是会修改页面或请求头的扩展;
- 保持浏览器更新到当前稳定版,旧版本本身就是少数;
- 隐私要求高的浏览,单独用一个干净的浏览器配置,不装多余字体和扩展。
浏览器自带的指纹保护
- Firefox:在
about:config中把privacy.resistFingerprinting设为true。开启后时区会统一报告为 UTC,窗口尺寸会被取整,Canvas 读取可能弹出授权提示,部分 API 返回统一值。日常使用也可以先只开“增强型跟踪保护”的严格模式。 - Tor Browser:默认让所有用户呈现尽量相同的指纹,适合高隐私需求,代价是速度和兼容性。
- 其他浏览器:部分浏览器提供 Canvas、WebGL 结果随机化或在隐私窗口中限制指纹 API,具体以各自官方文档为准。
这些做法的代价
开启指纹保护后,你可能遇到:网页显示的时间按 UTC 计算、地图或日历时区错乱、Canvas 类在线工具和部分验证码异常、登录时被要求更多验证。遇到某个网站无法正常使用,可以针对该站单独放行,而不是全局关闭。
指纹和 IP,哪个更容易认出你?
两者是互补的。IP 告诉网站你从哪个网络来,指纹告诉网站你用的是什么设备。很多网站会同时看两者,再加上延迟特征判断你是否经过中转,原理见 网站如何用延迟判断你在用代理。只处理其中一个,另一个依然可见。
如果你想把出口 IP、DNS、WebRTC、指纹和 API 连通性一次查完,可以按 开发者网络自检清单(2026 版) 走一遍。