Source: https://bscan.info/zh/blog/platform-spoofing
Language: zh-Hans

你的浏览器会在五个不同的地方声明它运行的操作系统。追踪器会把它们逐一交叉比对，只要有一个答案对不上，伪造就会暴露。

# 一个浏览器，五种操作系统声明：为什么平台伪造总是露馅

发布于 2026年6月11日 · 更新于 2026年9月30日

问你的浏览器它跑在什么操作系统上，你得到的不会是一个答案，而是五个。User-Agent 字符串会报出一个操作系统。`navigator.platform` 也会。Client Hints API、浏览器在每个请求上都会附带的 `Sec-CH-UA-Platform` 头，以及（在 Firefox 中）那个古老的 `navigator.oscpu` 属性，全都会。

在一台正常的机器上没人会注意到这一点，因为这五处说的都是同一件事。可一旦你改动了其中一处却忘了其余几处，你就不再像一台 Mac 或 Windows PC，而是变成了某种有意思得多的东西：一个正在说谎的浏览器。

**简短版：**你的浏览器会在若干个彼此独立的地方声明自己的操作系统——既有 JavaScript 里的，也有网络层上的。一个真实的浏览器在所有地方给出的都是同一个答案。伪造其中一处，其余几处就会与它矛盾，而这个矛盾比你真实的操作系统本身还要显眼。

本页上的这个小工具此刻正在你的浏览器上执行的，就是这套一模一样的交叉比对。

## 浏览器报出操作系统的五个地方

1.  **User-Agent 字符串。**经典之选。`Mozilla/5.0 (Windows NT 10.0; Win64; x64)...`，地球上每一款伪造扩展都会改它。
2.  **`navigator.platform`。**一个古老得多的 JavaScript 属性，大多数伪造工具压根就把它给忘了。
3.  **`navigator.userAgentData.platform`。**Chromium 浏览器里那套现代的 Client Hints API。任何脚本都能读取，无需任何权限。
4.  **`Sec-CH-UA-Platform` 头。**同样是 Client Hints 数据，但会随每个请求一起从网络发出。网站的服务器在你的 JavaScript 还没跑过一行的时候就已经读到了它。
5.  **`navigator.oscpu`。**仅限 Firefox。而这一点本身就是信息：一个自称“Windows 上的 Chrome”的浏览器却暴露了 `oscpu`，那它其实已经露馅了。

这些并不来自某个共享的设置。改动 User-Agent 不会更新那些请求头，而覆写某个 JavaScript 属性也触及不到网络层。正是这种彼此独立，让交叉比对得以奏效：

navigator.userAgent macOS _（已编辑）_

navigator.platform Win32

userAgentData.platform Windows

Sec-CH-UA-Platform header "Windows"

![](https://bscan.info/BadIcon.svg)

两种说法

被编辑过的 User-Agent 显示为 macOS，而其余三个来源仍然显示 Windows。只需一次交叉核对，伪装便会露馅。

这和抓出版本号伪造的是同一个陷阱，我们在 [你的 User-Agent 会撒谎，你的 Chromium 版本不会。](https://bscan.info/zh/blog/chromium-version) 一文中讲过。这个规律可以推而广之：你伪造的每一个信号，都多给了一次机会去和你没伪造的那些信号自相矛盾。

## 真实的浏览器也撒谎，只不过撒得有章可循

让人意外的地方在这里：一个诚实的浏览器同样不会准确报出你的操作系统。

-   在 64 位 Windows 上，`navigator.platform` 报的是 `Win32`。从上世纪九十年代起它就这么报，改掉它会弄坏那些老网站。
-   在 Apple Silicon 的 Mac 上，它报的是 `MacIntel`。里面根本没有 Intel，但这个标签在换芯之后还是保留了下来。
-   每一台现代 Mac 的 User-Agent 都会把上报的 macOS 版本号封顶，所以不同的 macOS 发行版可能呈现出完全相同的字符串。

追踪器把这些标准谎言背得滚瓜烂熟，而这是把双刃剑。一个因为觉得 `Win64` 听起来更正确而去这么报的伪造行为，会立刻变得可疑，因为从来没有哪个真实的浏览器这么说过。要想蒙混过关，赝品必须以和真品一模一样的方式撒谎。而大多数伪造工具并不懂这些门道。

## 就算标签完美无缺，也照样会泄露

假设你做得一丝不苟：User-Agent、`navigator.platform`、Client Hints 以及那些请求头全都被改写成一致指向 macOS。处处一致。这就完事了？

还差得远。那些标签只是操作系统里你能改名的那一部分。操作系统的其余部分还是会照着自己本来的样子行事：

标签声称 macOS

已安装的字体

Segoe UI, Calibri, Consolas

随 Windows 附带

WebGL 渲染器

ANGLE (NVIDIA ... Direct3D11)

Direct3D 仅限 Windows

滚动条宽度

17 px

典型的 Windows 数值

触控支持

maxTouchPoints: 10

没有 Mac 会报告触控

![](https://bscan.info/BadIcon.svg)

行为胜过标签

上面的每一行都可以被 JavaScript 读取，无需任何权限提示。你尽管随意重命名标签；底层的机器依然像一台 Windows PC 那样作答。

字体是其中动静最大的一个。Windows 自带 Segoe UI 和 Calibri，macOS 自带 Helvetica Neue 和 San Francisco，各种 Linux 发行版则自带 DejaVu。一个脚本在几毫秒之内就能把这些探测出来（我们的 [canvas 指纹文章](https://bscan.info/zh/blog/canvasHash) 演示了这套测量手法）。[WebGL 的 renderer 字符串](https://bscan.info/zh/blog/webgl-fingerprinting)同样直白：Direct3D 就意味着 Windows，Metal 就意味着 Mac，绝无例外。

所以，操作系统伪造并不是一个开关那么简单。它既是个标签问题，也是个行为问题，而行为问题要难对付得多。

## 到底该怎么做

1.  **如果你不是在刻意管理多重身份，那就别去伪造你的操作系统。**你会加入一小撮自相矛盾的怪浏览器，而不是那庞大的正常浏览器人群。融入人群胜过藏起来。
2.  **绝不要只伪造一半。**一个只改字符串的 User-Agent 切换器只会让你更容易被认出来，而不是更难。如果你没法把每一处表面都改掉，那就一处都别改。
3.  **如果你确实需要相互独立的多重身份，那就让整个技术栈保持一致。**标签、请求头、字体、WebGL，一个都不能少。这正是防检测浏览器存在的意义所在。[Incogniton](https://www.incogniton.com/?utm_source=bscanInfo&utm_medium=Website&utm_campaign=PlatformSpoofingBlog) 会这样去构建每一个配置文件：让操作系统这套说辞从网络层一直到字体列表都讲得前后一致，而不是往一台没动过的机器上硬贴一个新标签。

想看看你自己的浏览器扛不扛得住？本页上的这个小工具会检查你的操作系统信号，而 [完整扫描器](https://bscan.info/zh) 还会连同版本号检查、WebRTC 泄露测试以及另外十来项测试一起跑起来。

[运行完整的浏览器扫描](https://bscan.info/zh)

## 继续阅读

[

![你的 User-Agent 在撒谎，你的 Chromium 版本不会。](https://bscan.info/chromiumVersionCover.svg)

你的 User-Agent 在撒谎，你的 Chromium 版本不会。

](https://bscan.info/zh/blog/chromium-version)[

![Widevine DRM 与反检测浏览器：Zen 浏览器的反常现象](https://bscan.info/widevineCover.svg)

Widevine DRM 与反检测浏览器：Zen 浏览器的反常现象

](https://bscan.info/zh/blog/widevine-drm)[

![音频指纹：追踪的声音](https://bscan.info/audioCover.svg)

音频指纹：追踪的声音

](https://bscan.info/zh/blog/audioFingerprinting)

---
This is the page's server-rendered documentation. Interactive browser tests, file processing and permission prompts require the HTML page; Markdown does not contain live measurements or process files.
