字体指纹是一种浏览器追踪技术,利用JavaScript静默读取你设备上已安装的字体列表——无需Cookie,无需存储,没有任何可以删除的数据。你安装字体的组合出人意料地具有唯一性,网站用它跨会话和跨网站识别你。你现在就可以在 whatsmy.fyi 上查看你的浏览器暴露了哪些信号。
简短总结
字体指纹通过测量浏览器如何以数百种不同字体渲染文本来工作。如果某字体已安装,文本会以特定宽度渲染;如果未安装,浏览器会回退到尺寸不同的默认字体。通过在毫秒内探测300到700个字体名称,脚本可以组建你已安装字体的详细映射——这种组合极具辨识性,可为你的指纹增加10到15比特的熵,足以将你与数万名其他用户区分开来。
什么是字体指纹?
字体指纹利用每台设备附带不同字体选择这一事实。你安装的字体取决于你的操作系统、已安装的应用程序、是否手动添加了自定义字体以及你的系统语言。全新的macOS安装附带Apple内置字体集。Windows机器有自己的字体集。运行设计套件的Linux用户可能从Adobe、Google或其他来源加载了数百种额外字体。每种组合实际上都构成了一个指纹。
与Cookie不同,字体指纹不会在你的设备上留下任何内容。它不写入本地存储,不设置追踪器,也不请求权限。它只是读取浏览器标准字体渲染API已经可以公开访问的数据。 电子前哨基金会的Cover Your Tracks 工具一贯将字体枚举确认为整体浏览器指纹熵的重要贡献者。
字体指纹是更广泛的 浏览器指纹 技术家族中的一个信号。它通常与Canvas、WebGL和音频指纹一起部署,以建立高可信度的跨会话标识符。
字体指纹是如何工作的?
实际中使用两种不同的技术方法。两者都实现相同的目标——检测哪些字体存在——但通过不同的浏览器API。
方法一——CSS文本测量(measureText)
最常见的方法使用Canvas API的 measureText() 方法或CSS渲染来测量以特定字体渲染的字符串的像素宽度。脚本将同一字符串渲染三次:一次使用已知的后备字体(如等宽字体),一次使用衬线字体,一次请求被测字体。如果请求字体的宽度与后备字体完全匹配,则该字体未安装。如果宽度不同,则字体存在并被用于渲染。
对探测列表中的每种字体执行此比较——通常为300到700个字体名称。整个扫描在100毫秒内完成,完全在JavaScript中运行,对页面没有任何可见影响。
方法二——Canvas像素渲染
更精确的变体在隐藏的Canvas元素上以目标字体绘制文本,用 canvas.toDataURL() 提取生成的像素数据,并将像素输出与已知后备字体的输出进行比较。如果像素数组不同,则使用了请求的字体——意味着它已安装。这种方法更难欺骗,因为它捕获的是微妙的渲染差异,而非仅仅测量文本宽度。
// 通过measureText简化的字体指纹识别
function detectInstalledFonts(fontList) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const testString = 'mmmmmmmmmmlli'; // 对宽度变化敏感的字母
const baseFonts = ['monospace', 'sans-serif', 'serif'];
const testSize = '72px';
// 测量每种基础字体的宽度(后备宽度)
const baseWidths = {};
for (const base of baseFonts) {
ctx.font = `${testSize} ${base}`;
baseWidths[base] = ctx.measureText(testString).width;
}
const detected = [];
for (const font of fontList) {
for (const base of baseFonts) {
// 如果测量宽度与后备不同,则字体已安装
ctx.font = `${testSize} '${font}', ${base}`;
const width = ctx.measureText(testString).width;
if (width !== baseWidths[base]) {
detected.push(font);
break;
}
}
}
return detected; // 已安装字体名称数组
}字体指纹有多唯一?
字体枚举为浏览器指纹贡献了大量熵。下表总结了关键研究发现。
| 发现 | 数值 | 来源 |
|---|---|---|
| 字体列表单独贡献的熵 | 10–15 bits | EFF Panopticlick研究 |
| 每台桌面设备平均安装字体数 | 50–200 | BrowserLeaks / 实地研究 |
| 典型指纹脚本探测的字体数 | 300–700 | BrowserLeaks字体测试 |
| 完成完整字体探测的时间 | < 100 毫秒 | BrowserScan / 实地测量 |
| 前10,000网站中使用字体检测的比例 | ~38% | 浏览器指纹调查(arXiv) |
| 字体+其他4个信号唯一识别用户的比例 | > 99% | 商业指纹平台 |
字体单独提供的10到15比特熵意味着你的字体列表能将你与大约1,000到32,000名其他用户区分开来。当与Canvas输出、WebGL渲染数据、屏幕尺寸和时区结合时,组合指纹接近Cookie的唯一性——而不在你的设备上存储任何内容。
现实中谁在使用字体指纹?
广告网络和跨站追踪
广告技术平台在第三方广告标签和追踪像素中嵌入字体检测脚本。随着第三方Cookie在Chrome、Safari和Firefox中逐步淘汰,字体指纹作为稳定的跨会话标识符变得越来越重要。与Cookie不同,它无法被清除、被Cookie通知拦截或过期。主要数据经纪商将字体列表与数十个其他信号叠加,建立跟随用户浏览网络的持久档案。
欺诈检测和风险评分
安全平台使用字体指纹检测账户劫持和凭证填充。如果返回用户的字体列表与存储的档案大相径庭——例如,攻击者使用字体极少的新虚拟机——这会触发风险信号。字体在会话间的一致性是合法设备验证的有价值被动信号。
付费墙和反机器人执行
出版商和订阅服务使用字体指纹对清除Cookie以重置计量访问的用户执行文章限制。由于字体档案反映的是底层操作系统和已安装应用程序而非浏览状态,它在Cookie删除、隐私模式甚至某些VPN配置下依然有效。
设计和创意工具
少数合法的网络应用程序——如在线设计编辑器——使用字体检测只显示用户实际安装的字体,避免预览损坏。这种用例通常会披露并直接使用户受益,是例外而非常规。
字体指纹合法吗?
根据GDPR,当字体指纹生成的标识符可以与个人关联时,字体指纹构成个人数据处理。法国数据保护机构(CNIL)明确将浏览器指纹识别——包括字体枚举——归类为需要知情同意,除非适用狭义的合法利益豁免,如欺诈预防。根据美国CCPA和CPRA,字体指纹数据被视为需要退出权的个人信息。
W3C指纹识别指南 将字体枚举确认为"高熵被动指纹识别面",并建议浏览器供应商限制对本地安装字体的访问。全球执法仍然不一致。
如何保护自己免受字体指纹追踪
以下选项按最强保护到最适合日常使用的顺序排列。
- Tor Browser(最强保护):Tor Browser将页面限制在浏览器自带的固定字体集。你本地安装的字体对网站完全不可见,每个Tor用户呈现相同的字体列表——使基于字体的识别不可能实现。代价是由于Tor网络导致浏览速度较慢。
- Brave Browser(推荐日常使用):从1.39版本开始, Brave随机化向网页暴露的字体列表。它不会暴露你真实安装的字体,而是返回一个随每个网站和每个会话变化的打乱和精简的子集。这防止了跨站追踪,同时保持浏览器完全正常运行。
- Firefox配合
privacy.resistFingerprinting:在about:config中启用此标志时, Firefox将字体访问限制 在操作系统附带的标准字体集——自定义或应用程序安装的字体被隐藏。依赖本地安装字体进行渲染的某些页面可能表现异常。 - 避免安装非常规字体:每种额外的非标准字体都会增加你字体指纹的唯一性。安装大型专业字体库的设计师和排版专家比坚持使用系统默认字体的用户更容易被识别。如果隐私是优先考虑的,请减少额外字体安装。
- 使用VPN——但了解其限制:VPN会屏蔽你的IP地址,但对浏览器暴露的字体列表没有任何影响。它消除了一层追踪,但无法解决指纹识别问题。你可以在 whatsmy.fyi 上验证你的VPN是否正常工作。
- 浏览器扩展(效果有限):CanvasBlocker(Firefox)等扩展可以拦截
measureText()和Canvas调用并返回欺骗值。然而,字体欺骗是一场持续的军备竞赛——一些指纹脚本会检测到不可能的结果并回退到其他方法。扩展是补充措施,而非主要防御手段。
常见问题
字体指纹在无痕或隐私模式下有效吗?
有效。隐私浏览防止浏览器保存历史记录、Cookie和会话数据——但它不会改变系统上安装的字体。你的字体指纹在隐私窗口和普通窗口中是相同的。只有具有主动字体保护的浏览器(如Brave或Tor Browser)才会在隐私模式下呈现不同的字体档案。
VPN能阻止字体指纹追踪吗?
不能。VPN加密你的流量并改变你可见的IP地址,但它无法访问浏览器的渲染引擎。字体指纹通过浏览器的JavaScript API从操作系统的字体注册表读取数据——这一层完全不受你的网络配置影响。要防止字体指纹追踪,请使用Brave、开启 privacy.resistFingerprinting 的Firefox或Tor Browser。
指纹脚本实际检测多少种字体?
典型的生产脚本探测300到700个字体名称。探测列表包括常见系统字体(Arial、Times New Roman、Georgia)、特定操作系统字体(macOS上的San Francisco、Windows上的Segoe UI)、Adobe Creative Cloud、Microsoft Office或Google Drive安装的应用字体,以及中文、阿拉伯文、希伯来文等语言的特定字体。完整扫描在100毫秒内完成,对用户完全不可见。
字体指纹与Canvas指纹有什么区别?
它们相关但不同。Canvas指纹读取由GPU、图形驱动和操作系统文本渲染器引起的像素级渲染差异。字体指纹专门通过测量文本尺寸或比较每种字体的Canvas像素输出来检测安装了哪些字体。它们经常一起部署,因为它们是互补的:Canvas捕获硬件级变化,而字体枚举捕获来自已安装应用程序的软件级变化。查看 Canvas指纹指南 进行详细比较。
设计师或开发者的机器通过字体更容易被追踪吗?
是的,明显更容易。运行Adobe Creative Cloud的设计师可能在系统默认之外加载了500种或更多额外字体。安装了JetBrains Mono、Fira Code或Cascadia Code等编程字体的开发者增加了额外的独特信号。每种非标准字体都会缩小共享相同字体档案的用户池,使个人识别更加容易。重度字体用户如果重视隐私,应使用Brave的字体随机化或Tor Browser。
清除Cookie或重置浏览器能消除我的字体指纹吗?
不能。字体指纹从操作系统的字体注册表派生其标识符,而非从浏览器中存储的任何数据。清除Cookie、删除本地存储、重置浏览器设置,甚至重新安装浏览器都不会影响系统暴露的字体列表。只有在安装或删除字体,或切换到主动限制字体枚举的浏览器时,指纹才会改变。
字体指纹与浏览器语言指纹有什么区别?
两者都是被动指纹信号,在不需要用户操作的情况下揭示系统信息。字体指纹枚举你安装的字体——受应用程序和语言偏好影响的软件级信号。浏览器语言指纹读取 Accept-Language HTTP头和 navigator.languages API来检测你偏好的语言——配置级信号。两者都为同一复合指纹做出贡献。查看 浏览器语言指纹指南 了解更多详情。
相关文章
- 什么是浏览器指纹?网站如何在不使用Cookie的情况下追踪你 ——将所有指纹信号组合起来的完整指南
- 什么是Canvas指纹识别?网站如何在不使用Cookie的情况下追踪你 ——HTML5 Canvas API如何从GPU渲染创建唯一标识符
- 什么是音频指纹?AudioContext如何追踪你的浏览器 ——你设备的音频栈如何产生持久标识符
- 什么是浏览器语言指纹?你的语言设置如何追踪你 ——Accept-Language和navigator.languages如何揭示你的身份
- 什么是WebGL指纹?你的GPU如何识别你的浏览器 ——3D图形API如何暴露你的GPU供应商、型号和驱动版本



