MIME 与编解码器指纹:媒体支持追踪
MediaCapabilities、canPlayType 和编解码器支持查询如何创建唯一指纹,以及控制媒体格式身份的技术。
简介
现代浏览器支持多种媒体格式,从 H.264 和 AAC 等成熟标准到 AV1、VP9 和 Opus 等较新的编解码器。Web 开发者需要知道浏览器可以播放哪些格式,因此平台提供了多个用于查询媒体能力的 API。这些 API 帮助网站为每个访问者提供正确的视频和音频格式,确保最佳的播放质量和性能。
然而,编解码器支持在不同浏览器、操作系统版本和硬件配置之间存在显著差异。具有硬件视频解码的 Windows 浏览器报告的能力与同版本但没有硬件加速的 Linux 浏览器不同。这些差异创建了一个稳定的、可查询的指纹,不需要任何权限,也不产生任何用户可见的指示。任何网站都可以在毫秒内枚举编解码器支持,在你不知情或不同意的情况下构建你设备的详细媒体能力档案。
这就是为什么媒体格式指纹是一个严重的隐私问题,也是为什么 BotBrowser 在引擎级别提供全面保护。
隐私影响
媒体能力指纹特别有效,因为编解码器格局高度碎片化。与产生少量不同值的简单指纹信号不同,编解码器支持创建了数百种潜在组合的矩阵。这种高熵使其成为网站可用的更强大的指纹技术之一。
考虑跨平台存在的变化范围:
- 硬件视频解码取决于浏览器版本、GPU 型号和操作系统。特定编解码器的硬件加速可用性会暴露系统硬件的详细信息。
- 特定平台编解码器在某些操作系统上可用而在其他系统上不可用。某些编解码器通过操作系统的原生媒体框架提供,使它们成为你平台的直接指示器。
- 高级编解码器(如 Dolby Vision 和 Dolby Atmos)仅在特定硬件和操作系统组合上可用,进一步缩小了你的设备身份范围。
- 容器和编解码器组合根据浏览器和平台产生不同的支持级别,为指纹创建额外的数据点。
- 音频编解码器支持在不同平台之间存在微妙差异,增加了整体指纹的信息量,尽管大多数现代浏览器共享一个共同基线。
对数十种常见媒体格式查询的响应组合产生了高度独特的档案。当使用更高级的能力查询时,还会暴露关于硬件加速、能效和流畅播放的额外信息,进一步增加指纹的唯一性。
2022 年对 Alexa 前 10,000 个网站的分析发现,超过 15% 的网站将媒体能力查询作为其指纹脚本的一部分。这些查询速度快,不需要权限,且与用于媒体播放的合法功能检测无法区分。这使得它们难以在不破坏网页体验的情况下被阻止。
为什么这对你的隐私很重要
你的硬件被暴露
每次媒体能力查询都会暴露你硬件的信息。你的 GPU 是否支持特定格式的硬件解码、你的操作系统原生提供哪些编解码器,以及你的设备对各种媒体类型能达到什么性能水平。所有这些信息都是静默暴露的,没有任何通知或同意提示。
持久标识
与可以清除的 Cookie 不同,你的编解码器支持档案与你的硬件和操作系统绑定。它在浏览会话、隐身模式甚至清除所有浏览器数据后都保持不变。这种持久性使编解码器指纹对追踪目的特别有价值。
跨站追踪
因为你的编解码器档案在你访问的每个网站上都是一致的,它可以用作关联标识符。两个不同的网站如果都查询你的媒体能力,将收到相同的响应,使它们即使没有共享 Cookie 或登录信息也能关联你的访问。
无用户感知
当网站查询你的媒体能力时,没有视觉指示器。不会出现权限对话框。地址栏中不会显示图标。用户无法知道他们的编解码器档案正在被收集,也没有浏览器设置可以阻止它。
常见保护方法及其局限性
VPN 和代理服务器
VPN 对编解码器支持查询没有任何影响。媒体能力检测完全在浏览器内部进行,不涉及网络请求。使用同一 VPN 的两个设备根据各自的本地硬件和软件报告完全不同的编解码器档案。VPN 保护你的 IP 地址,但完全暴露你的媒体指纹。
隐身和隐私浏览
隐私浏览模式不会修改编解码器支持。隐身模式和正常窗口返回相同的响应,因为编解码器支持由浏览器二进制文件和操作系统配置决定,而不是由存储数据决定。隐身模式旨在防止 Cookie 和历史持久化,而不是改变设备的基本能力。
浏览器扩展
尝试修改媒体能力响应的扩展面临几个根本问题:
- 跨多个 API 的一致性: 浏览器通过几个不同的接口暴露编解码器信息。修改一个而不同时修改其他的会创建可检测的不一致性,这实际上比原始指纹对你的隐私更不利。
- 功能影响: 错误地将编解码器报告为不支持(而实际上可用)会破坏视频和音频播放。将编解码器报告为支持(而实际上不支持)会导致播放失败。两种情况都会影响用户体验。
- 检测表面: 在 JavaScript 级别覆盖原生浏览器方法会改变其内部属性,可以通过检查技术检测到。
- 范围限制: 扩展通常无法拦截来自 Web Workers 或 Service Workers 的能力查询,使这些上下文的信息不受保护。
随机化
随机修改编解码器响应是不切实际的。与 Canvas 或音频指纹可以进行小噪声扰动不同,编解码器支持从根本上是二元的:一个格式要么支持要么不支持。随机响应会破坏媒体播放并产生明显无效的组合,比原始指纹更引人注目。
BotBrowser 的引擎级方法
BotBrowser 在浏览器引擎级别控制媒体能力响应,确保所有与编解码器相关的 API 返回与加载的指纹配置文件一致的结果。这不是 JavaScript 补丁或浏览器扩展。BotBrowser 修改浏览器的内部媒体能力报告,使每个 API 都返回真实的、配置文件一致的结果。
基于配置文件的媒体能力
当加载指纹配置文件时,BotBrowser 配置完整的编解码器支持矩阵以匹配配置文件的目标平台:
chrome --bot-profile="/path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
配置文件定义了完整的编解码器响应集,从匹配配置文件配置的真实设备捕获。这包括:
- 每种媒体格式和编解码器组合的正确支持级别
- 适当的硬件加速标志
- 平台准确的能效和流畅播放指示器
- 所有媒体能力 API 之间一致的响应
每个响应都与具有配置文件配置的真实设备报告的内容匹配。没有间隙、没有不一致,也没有可能表明响应已被修改的信号。
跨 API 一致性
BotBrowser 确保所有与编解码器相关的 API 相互一致。如果一个 API 报告支持某种格式,其他 API 也会报告一致的支持及适当的详细信息。这种多 API 一致性至关重要,因为指纹脚本经常查询多个 API 并比较结果以检测不一致。
平台准确的响应
Windows 配置文件报告 Windows 特定的编解码器(包括通过平台原生媒体框架提供的编解码器),而 Linux 配置文件省略在 Linux 上不可用的平台编解码器。这种对齐扩展到硬件加速:针对具有特定 GPU 的系统的配置文件报告与该 GPU 解码器支持一致的硬件解码能力。
这种平台准确性是 BotBrowser 与表面级方法的区别。媒体能力档案的每个细节都对应一个真实的、连贯的硬件和软件配置。
无功能影响
因为 BotBrowser 控制引擎级编解码器报告而不是阻止 API 调用,媒体播放继续正常工作。使用编解码器查询进行合法格式选择的网站会收到关于浏览器可以播放什么的适当信息。你的隐私受到保护而不牺牲功能。
配置与使用
基本 CLI 使用
加载配置文件时,编解码器保护是自动的:
chrome --bot-profile="/path/to/profile.enc" \
--user-data-dir="$(mktemp -d)"
Playwright 集成
const { chromium } = require('playwright-core');
(async () => {
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
],
headless: true,
});
const context = await browser.newContext({ viewport: null });
const page = await context.newPage();
// 导航以验证编解码器信号一致
await page.goto('https://example.com');
// 检查编解码器保护是否激活
const codecInfo = await page.evaluate(() => {
const video = document.createElement('video');
const codecs = [
'video/mp4; codecs="avc1.42E01E"',
'video/webm; codecs="vp9"',
'video/mp4; codecs="av01.0.01M.08"',
'audio/mp4; codecs="mp4a.40.2"',
'audio/webm; codecs="opus"',
];
return codecs.map(c => ({
codec: c,
supported: video.canPlayType(c),
}));
});
console.log('Codec support:', JSON.stringify(codecInfo, null, 2));
await browser.close();
})();
Puppeteer 集成
const puppeteer = require('puppeteer-core');
(async () => {
const browser = await puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
],
headless: true,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('about:blank');
// 验证媒体能力匹配配置文件
const capabilities = await page.evaluate(async () => {
const result = await navigator.mediaCapabilities.decodingInfo({
type: 'file',
video: {
contentType: 'video/mp4; codecs="avc1.640028"',
width: 1920, height: 1080, bitrate: 5000000, framerate: 30,
},
});
return {
supported: result.supported,
smooth: result.smooth,
powerEfficient: result.powerEfficient,
};
});
console.log('Media capabilities:', capabilities);
await browser.close();
})();
验证
使用配置文件启动 BotBrowser 后,验证你的媒体能力保护是否正常工作:
- 支持级别匹配配置文件目标平台的预期值。每个编解码器应返回具有配置文件配置的真实设备会产生的响应。
- 跨 API 一致性得到维护。所有媒体能力 API 应相互一致。如果一个报告支持某格式,其他的应保持一致。
- 特定平台编解码器与配置文件的操作系统对齐。仅在某些平台上可用的编解码器应根据配置文件存在或不存在。
- 结果稳定,在页面重新加载和浏览器重启之间保持一致。你的媒体能力指纹应每次都可重复和一致。
- 指纹测试工具在媒体能力检测中不报告异常。你可以使用流行的指纹测试网站来验证你的编解码器档案看起来是真实的。
最佳实践
-
使用完整配置文件。 编解码器支持与操作系统、浏览器版本和 GPU 紧密相关。完整的配置文件确保所有三个维度一致。BotBrowser 配置文件从真实设备捕获,因此完整性是内置的。
-
将配置文件匹配到预期用例。 如果你的工作流程涉及媒体密集型网站,选择支持这些网站期望的编解码器的配置文件。缺少某些编解码器的配置文件可能导致某些流媒体网站上的质量降低。BotBrowser 提供各种平台配置的配置文件以匹配你的需求。
-
验证跨 API 一致性。 始终确认多个媒体能力 API 相互一致。指纹脚本会比较跨 API 的结果,因此一致性至关重要。BotBrowser 自动处理这一点,但验证给你信心。
-
不要安装额外的编解码器扩展。 添加编解码器支持的浏览器扩展(如 h265ify)可能会更改编解码器档案并与 BotBrowser 的引擎级控制冲突。让配置文件完全处理编解码器报告。
-
结合 DRM 信号保护。 媒体编解码器能力和 DRM 编解码器能力应讲述一致的故事。使用单个 BotBrowser 配置文件确保两者之间的一致性。详情请参阅 DRM 信号保护文章。
常见问题
编解码器指纹在所有浏览器上都有效吗?
是的。所有主要浏览器都实现了媒体能力 API。这些查询在所有平台上一致工作,这就是为什么编解码器指纹是一种广泛使用的技术。BotBrowser 保护这些查询,无论配置文件的目标浏览器如何。
存在多少种不同的编解码器指纹?
数量非常大。数十种常见查询的编解码器字符串,每个返回多个可能的值,理论上的组合空间是巨大的。实际上,真实设备聚集在几百种常见配置中,但指纹仍然高度独特。BotBrowser 配置文件对应真实设备配置,确保你的指纹落在正常分布范围内。
编解码器支持会在浏览器版本之间变化吗?
是的。新浏览器版本添加对新编解码器的支持,偶尔也会弃用旧编解码器。BotBrowser 配置文件针对特定浏览器版本进行版本控制,因此你的编解码器档案始终对应有效的真实世界配置。
网站能检测到编解码器响应被控制了吗?
如果控制在 JavaScript 级别应用(覆盖原生方法),则可以被检测到。BotBrowser 在引擎级别应用控制,因此原生方法本身返回配置文件一致的值。没有 JavaScript 覆盖可以检测。保护对网站是不可见的。
这会影响实际视频播放吗?
BotBrowser 的编解码器报告设计为与加载配置文件下浏览器的播放能力一致。使用编解码器查询进行格式选择的网站会收到适当的响应,媒体播放正常工作。你获得隐私保护而不牺牲浏览体验。
加密媒体(EME)编解码器查询呢?
EME 编解码器查询(用于 DRM 保护内容)也由配置文件控制。详情请参阅 DRM 信号保护文章。BotBrowser 确保通用和 DRM 特定的编解码器查询都是一致的。
这如何与 WebRTC 编解码器协商交互?
WebRTC 通过 SDP(会话描述协议)使用单独的编解码器协商。BotBrowser 配置文件控制 Web 媒体编解码器查询和 WebRTC 相关编解码器信号,以实现全面的一致性。你的媒体指纹在所有上下文中都受到保护。
总结
MIME 类型和编解码器支持查询是一个高熵指纹表面,可以暴露操作系统、硬件和浏览器配置细节。这些查询静默运行,不需要权限,并产生跨会话持久的稳定结果。BotBrowser 通过其配置文件系统在引擎级别控制所有媒体能力 API,确保一致的、跨 API 准确的、与目标平台匹配的响应。你的编解码器指纹是真实的、稳定的,与真实设备无法区分。结合 DRM 信号保护、音频指纹控制和全面的配置文件管理,BotBrowser 提供彻底的媒体指纹保护。