# 怎样确认你的文件留在自己的设备上

> 打开浏览器的开发者工具，切到“网络”面板，清空列表，然后选一个文件并处理：列表里不应该出现带着你文件的新请求，也不应该有发往其他网站的请求。你会看到的请求只来自三处：页面加载、你主动要求的辅助组件（来自本站的模型和 WebAssembly 文件），以及 Cloudflare 的统计信标。

## 为什么要检查

本站每个页面都说文件在你的浏览器里处理、不会上传。这是一句声明，而关于隐私的声明，说出来不费什么力气。本站的源代码没有公开，所以这一页不请你去读代码，而是教你看页面实际做了什么。浏览器会记录页面发出的每一个网络请求，并且让任何人都能查看这份记录。

## 在 Chrome 或 Edge 里检查

1. 打开要测试的工具页面，比如清除照片元数据的那个工具。
2. 按 F12 打开开发者工具（也可以用快捷键：Mac 上是 Cmd+Option+I，Windows 和 Linux 上是 Ctrl+Shift+I），点“网络”（Network）标签。
3. 勾选“保留日志”（Preserve log），这样页面变化时列表不会被清掉；再点清除按钮（一个带斜线的圆圈），把列表清空。
4. 在工具里选一个文件，等它处理完。点工具要求的按钮，比如“开始”或“导出这张图片”，然后下载结果。
5. 看列表。在过滤框里输入 `method:POST`，只显示发送数据的请求；再输入 `-domain:startprivate.com`，只显示发往其他网站的请求。在文件处理期间，这两个过滤条件下都不应该出现任何东西。

## 在 Firefox 里检查

1. 打开工具页面。
2. 在 Windows 和 Linux 上按 Ctrl+Shift+E，在 Mac 上按 Cmd+Option+E，直接打开网络监视器。
3. 在面板的设置菜单（齿轮图标）里，打开“持续记录”（Persist Logs），再点垃圾桶图标清空列表。
4. 选一个文件并处理，然后下载结果。
5. 读一遍列表。过滤框接受同一类过滤条件，比如 `method:POST`；点任意一行，就能看到它发往哪里、带了什么。

## 在 Mac 上的 Safari 里检查

1. 选取“Safari 浏览器”>“设置”，打开“高级”，勾选“显示网页开发者功能”。菜单栏里会出现“开发”菜单。
2. 打开工具页面，再选取“开发”>“显示网页检查器”（Option-Command-I），点“网络”标签。
3. 用垃圾桶按钮清空列表。
4. 选一个文件并处理，然后下载结果。
5. 看看有没有新出现的行；如果有，点一下，查看它的地址和方法。

在 iPhone 或 iPad 上，Safari 自己没有“网络”面板。可以在手机 Safari 设置的“高级”里打开“网页检查器”，用数据线把手机连到 Mac，再从 Mac 的“开发”菜单检查手机上的标签页。安卓上的 Chrome 也能用同样的方式检查，从电脑版 Chrome 打开 `chrome://inspect` 即可。

## 你会看到什么，代表什么

**页面加载时**：页面本身、一个样式表、`/assets/` 下的几个脚本文件，有时还有一个小的语言文件，以及图标和应用清单。这些都来自 startprivate.com。另外还有一个统计脚本，地址是 `static.cloudflareinsights.com`。

**点了需要辅助组件的按钮时**：一批发往 startprivate.com 的 GET 请求，取回程序文件和模型，比如 `/v/` 和 `/assets/` 下面的文件。这是在下载人脸识别模型（约 1 MB）、文字识别程序、内容凭证（C2PA）读取器（约 8.6 MB）、Office 处理库或者密码词表。这些是发到你这边来的文件，不是你的文件发出去。点开其中一个，会看到它是一个请求正文为空的 GET 请求。

**选好文件并处理时**：没有任何离开你设备的新请求。你可能会看到地址以 `blob:` 或 `data:` 开头的条目。这些是你浏览器内部的地址，用于预览和下载，不会发到网络上。

**统计信标**：Cloudflare 的网站统计服务（Web Analytics）在页面加载时发送一份小报告，页面被隐藏或关闭时再发一次，所以切到别的标签页也可能多出一行。根据本站的提供方式，它发往本站的 `/cdn-cgi/rum`，或者发往 `cloudflareinsights.com`。点开它，查看请求载荷：里面是页面计时数据和页面地址，没有文件内容。如果你用内容拦截器挡掉它，工具照样完全正常。

**一个有意的例外**：在密码强度页面上，勾选“检查已知数据泄露”会向 `api.pwnedpasswords.com` 发一个 GET 请求，里面是哈希值的 5 个字符。这个选项默认关闭；除此以外，任何页面都只允许连接本站和统计地址。

## 第二道防线：安全策略

每个页面发出时都带着一个 Content-Security-Policy（内容安全策略）响应头。它告诉浏览器的事情里有这几条：页面只能连接本站和 Cloudflare 的统计地址，只能加载本站的脚本和那个统计脚本。如果页面上有任何代码想把数据发到别处，浏览器自己就会拦下来，并记录一条错误。你可以在“网络”面板里看到这条策略：点第一行（页面本身），在“响应标头”下面找 `content-security-policy`。在密码强度页面上，你会在里面看到多出来的一个地址，也就是泄露列表。

每个页面里的脚本和样式还带着子资源完整性（Subresource Integrity）哈希值，所以文件和页面预期的版本对不上时，浏览器会拒绝运行它。

## 每类工具怎样工作

**照片（JPEG、PNG、WebP、HEIC）。** 元数据在字节层面删除。工具逐个走过文件的段、块或盒子，丢掉装着 EXIF、GPS、XMP、IPTC、厂商注释、内容凭证、注释和内嵌缩略图的那些，图像数据原封不动地复制过去。图片从不解码，也不重新编码，所以和原图逐像素相同。旋转标记和色彩配置文件会保留，照片才能正确显示。色彩配置文件原样保留，连同里面的短文字（说明、版权行，有时还有某台设备的名字或制作这份配置文件的人的名字）：结果会把它列在剩下的内容里，EXIF 查看器会显示这些文字。在“只清除定位”模式下，EXIF 块就地编辑，而且只在工具能把它完整读完时才这样做：固定清单上的条目（日期、相机、拍摄参数、序列号、所有者和作者姓名）如果装的是这类条目该装的东西，就留下；其他条目一律删除；清单上的条目如果写成了清单预期以外的类型或数量，或者某个保留下来的数字拼出了一个名字里的三个字母，也删除；读不到底的块整个拿掉。对数字的这项检查只涉及数值字段，也就是这个模式保留的 EXIF 数字，以及色彩配置文件里的数字（两种模式都保留色彩配置文件）；相机和手机不会在那里写名字，只有故意构造的文件才会。它能发现以普通字节、UTF-8 或 16 位字符写成的拉丁、希腊和西里尔字母，包括写成单独附加符号的重音；以单个字节存放的带重音字母，以及其他文字（中文也在其中），没法和数字区分开。在色彩配置文件里，配置文件的大小和曲线的点数，只要和配置文件的结构一致、又没有超出真实配置文件的用量（1 MB、64 个标签、4096 个曲线点），就不会被当作字母；超出这个范围的配置文件，会被列为含有标准配置文件不带的数据。作者、版权这类文本字段是另一回事，见下文“限制”里“只清除定位模式下的相机和姓名”一条。JPEG 存在主画面后面的数据，比如 Ultra HDR 增益图或动态照片里的视频，一律删掉。工具无法从头走到尾的文件会直接拒绝，它不涵盖的类型也一样：算术编码和分层模式的 JPEG、HEIC 图像序列、动态 AVIF，以及带有陌生盒子的 HEIC。

**视频（MP4、MOV）。** 所有轨道里只保留画面和声音。其他轨道（GPS 和传感器遥测、时间码、相机专用数据，以及字幕轨，除非你选择保留）的数据用零填满并标为空闲空间，`udta`、`meta` 和 `uuid` 这类元数据盒被清空，创建和修改时间设为零。有一个 `uuid` 盒会保留：360° 视频轨道里 Google 的球面视频盒，里面写着投影方式和拼接软件的名称，播放器要靠它才能以 360° 显示视频；结果会把它列为保留项。在保留下来的轨道的编码参数中，画面轨编码为 H.264、H.265 或 ProRes 时，有一个字段会被清空：描述里编码器写自己名字的那个位置（GoPro 文件在那里写着“GoPro AVC encoder”），除非那里只写着编码格式的名称。其他编码格式保留这个字段。其余部分不作编辑，仍可能写着编码器的名字，结果会把每个这样的名字连同它的原文列出。文件长度不变，画面和声音不重新编码，输出是由原文件的一个个切片加上一些小补丁组装起来的，所以几 GB 的文件也不需要整个装进内存就能处理。

**Office 文件（DOCX、XLSX、PPTX）。** 这些是装着 XML 文件的 zip 压缩包，在后台线程里解压，分两个互不相干的步骤处理。清理程序先上场。它删除作者和公司属性、批注及其作者、自定义属性、隐藏文字、编辑会话编号、共同创作记录、加载项标记、邮件合并和网页发布设置，以及敏感度标签数据；修订则按你的选择处理，要么全部接受，要么隐藏修订人。凡是能确定一个值就是某个文件所在位置的地方，文件夹路径都缩短成文件名：链接的目标、只由路径组成的图片说明、Word 域要插入的文件（不包括域代码里的其他文字），以及 Excel 公式里指名另一个工作簿的位置（不包括引号之间输入的文字）。在其他地方找到的路径照原样保留，并在结果里列出。有一种情况两头都落空：公式用几段文字拼出来的位置，认不出是路径，只有本身就像路径的那一段会列出。有些东西是有意保留的：数字签名、正文里显示作者或文件名的域、数据连接、加载项数据、链接背后的邮箱地址，以及指向内部网络地址的链接。第二步是对生成文件的独立检查。它和清理程序不共用任何清单，按部件、按属性把输出和公开发布的格式定义（微软 Open XML SDK 附带的架构数据）逐一比较。一个部件、元素或属性，只有定义认得它，而且检查下来是干净的，才算已检查。除此之外的一切，包括有意保留的项目，以及工具不认识的部件或标记，都会连同所在部件的名称列在结果顶部，取代“文件已清理干净”这类说法。最后一步，从原文件读出的姓名、姓名缩写和账号标识，会在清理后文件的每个部件里查找，找到的也会列出。如果文件属性里记录的姓名（作者、最后保存的人、批注的作者等）也出现在文档自己的文字里，不论那段文字显示还是隐藏，都会列在警告里；名字留不留，由你检查后决定。有几种情况只给一条不显眼的说明，而不是警告：内容里有读起来像文件夹路径、内部地址或账号的文字（见下文的限制）；以及没能查找的记录姓名，原因要么是它只有一两个字母或数字，要么是原文件里装着它的那个部件读不了。一个部件被符合规范的 XML 读取器拒绝时，即使在里面找到了姓名，也算没读；带有文档类型声明的部件，或者声明的编码不在 UTF-8、UTF-16、windows-1252、ISO-8859-1 和 US-ASCII 之列的部件，也一样。“User”这类少数几个默认词根本不查找，下文“限制”一节列出了它们。部件逐个解压，并有固定上限（单个部件或单张图片 64 MB；所有文本部件合计 256 MB；包里的全部内容合计 512 MB，图片和没打开的部件都算在内；一个部件里一百万个 XML 节点，每个元素、每条注释和标签之间的每段文字各算一个；嵌套 512 层，一遍读完的部件 2048 层；一个元素 2000 个属性；包里 10000 个条目），所以专门做来耗尽内存的文件会被拒绝，而不是被处理。清除前后对照表列出改动了什么。内嵌的照片（JPEG、PNG、WebP、HEIC）交给照片清理程序；其他内嵌图片、媒体文件或对象不打开，并报告为仍留在文件里。

**内容凭证查看器。** 页面先在本地查看文件里到底有没有 C2PA 数据。只有有的时候，才加载读取器，并且设置成不获取远程清单、吊销状态或信任列表。所以它报告的是签名是否完好，而不是签名者是否可信。

**打码。** 编辑器在画布上画一份工作副本，每边上限约 2048 像素，框的位置按原图坐标记录。导出时，后台线程用原尺寸图片重新绘制并盖上遮挡，再编码成一个新文件，所以不会带出任何元数据。如果浏览器无法以原尺寸编码，会改用 4096 像素再试一次。人脸识别用的是在 TensorFlow.js Web 上运行的 YuNet 模型；文字识别用的是 Tesseract OCR 引擎，加上规则匹配和 ZXing 条码读取器。

**密码和密码短语。** 所有随机数都来自浏览器的 `crypto.getRandomValues`，并用拒绝采样保证每个字符或单词出现的概率都相同。生成的任何内容都不保存、不发送。

**文件哈希。** 文件在后台线程里按 8 MiB 一片读取，交给 hash-wasm 里的 SHA-2、SHA-1 和 MD5 实现计算。

**文本加密。** 使用浏览器 Web Crypto API 提供的 AES-256-GCM，密钥由 hash-wasm 的 Argon2id 从密码派生（64 MiB、3 轮）。

**密码强度。** zxcvbn-ts 在页面里给密码评分；上面说的泄露检查，是唯一可能发出请求的部分。

## 限制

这些工具删除它们认得的东西，并列出它们保留的东西。所以，结果什么都没列出，意思是“没有找到本工具检查的任何内容”，并不等于“这个文件没有透露任何关于你的信息”。下面是这些工具做不到的事。

- **公式拼出来的路径。** Excel 公式可以用几个独立的字符串拼出一个地址或文件夹路径，比如 `="D:\Team\" & B2 & "\plan.xlsx"`。要看出结果是一条路径，就得把公式算出来，而工具只读公式。单独一段看起来像路径的（这里是 `"D:\Team\"`）仍会列出。
- **常见默认词充当的名字。** 如果 Office 文件属性里记录的姓名或公司恰好是“user”“admin”“administrator”“owner”“author”“guest”“unknown”“test”或“microsoft”之一，不论大写小写，这个属性照常删除，但不会在文件其余部分查找这个词。普通文件的字体、主题和样式名里就有这些词，几乎每次找到的都会是误报。只有一两个拉丁字母或数字的记录姓名、公司或账号（“HP”“Jo”）也不查找，不含任何字母或数字的值和全由零组成的标识也一样；遇到这些情况，结果会针对那个文件说明。用其他文字写的名字，比如中文或阿拉伯文，不论多长都会查找。Word 和 PowerPoint 存在批注作者旁边的姓名缩写，是这条说明的唯一例外：缩写只有一两个字母或数字时不查找，也不作说明，因为会被查找的作者全名就紧挨着它。三个字符及以上的缩写，和姓名一样查找。
- **写成编码的名字。** 清理后，工具会在文件里查找原文件记录的每个姓名、每组缩写和每个账号。每段文字先按原样比较一遍，再在还原一份固定的写法清单之后比较一遍，清单一共十项：XML 字符引用（`&#74;`）；Excel 用的 `_x004A_` 形式；百分号转义（`%4A`）；字母大小写、字符全角半角以及不显示的字符上的差别；公式里写了两次的引号；带引号的工作表名或工作簿名里写了两次的撇号（`'O''Brien'!A1`）；Excel 页眉页脚里表示“&”的 `&&`；链接地址 `?` 之后表示空格的 `+`；Word 域代码里的 `\"` 和 `\\`；以及文献管理软件存进域代码的 JSON 文字转义（`\u004A`）。每一项只在格式用到它的那类位置上起作用。除此之外一概不解码：存成 base64 的名字、`xn--` 形式的国际化域名，或者用数字格式的反斜杠拼出来的名字（`\J\a\n\e`），只有在别处也以普通形式出现时才找得到。
- **文档自己内容里的路径和内部地址。** 文档的正文、工作簿的单元格和幻灯片上的文字都是你的，工具不改。不过，如果那里有文字读起来像带盘符的文件夹路径、网络共享、个人文件夹（`~`、`/Users/…`、`/home/…`）或 `%USERPROFILE%` 这样的变量，像内部网络里的地址（`http://intranet/…`），或者像账号标识，工具会在结果下方的“补充说明”里指出来。说明写的是这段文字看起来像什么，并不断定它就是。其他形似路径的文字不会提示：网址里的路径部分（`/v1.0/teams`）、XPath、以 `//` 开头的一行示例代码、`localhost`、写在花括号里的占位主机名。同样的值如果出现在读者看不到的地方（属性、定义的名称、链接目标、域代码），照旧列在文件里还有的内容那一栏。
- **按写法判断网页链接。** 每个指向公开网页的链接都会列出，因为链接背后的地址不显示在页面上。以 Word、Excel 和 PowerPoint 常规写法挂在文字、单元格或图片上的链接，列为“补充说明”里一条不显眼的说明。以其他方式写下的链接（在页眉或批注里、在鼠标悬停动作上、在被合并覆盖或看似空白的单元格上、在数学公式里、在幻灯片没有显示的版式下面），不论看不看得见，都列为文件里仍有的链接，因为工具不去推算这种链接显示在哪里。这里说的链接，指点击时程序会打开的那种：挂在文字、单元格、形状或图片背后的超链接，Word 的 HYPERLINK 域，以及地址完整写出的 Excel HYPERLINK 公式。只是写下来的网址，不论在正文里、图片的替代文字里还是链接的屏幕提示里，都当作文字处理，适用上面关于内容和文件记录文字的规则。
- **显示着、却很难看到的文字。** Office 文件可以用自己的开关隐藏内容：“隐藏”字体效果、设为隐藏的对象、隐藏的行、列、工作表或幻灯片、设为不显示的数学公式部分。工具会读这些开关。对于开着的文字，它不判断格式让文字变成了什么样：白底白字、1 磅的字号、压在段落上面的形状、拖到幻灯片或页面外的对象。这样的文字当作普通内容处理，请自己查找；各个 Office 页面写了该去哪里找。
- **显示着的对象的名称和替代文字。** 显示出来的图片、形状或控件，名称和替代文字都是文件的一部分，不会报告为隐藏内容；只有隐藏的或不绘制的对象，才会把它们列出来。只是一条文件夹路径的名称或替代文字，会像其他路径一样缩短。较长的名称或替代文字里如果夹着路径、内部地址或账号，会报告出来，文件属性里记录的姓名也一样。
- **接受和拒绝混在一起的修订。** Word 文档保留着修订时，打开它的人可以对每一处单独接受或拒绝。由这些单独选择产生的各种组合，不会逐一检查；检查的是每个人原本输入的内容，按他们输入时的样子。
- **图片画面里的东西。** 图片的压缩数据和调色板照搬过去，没有人去看。人脸、车牌、房子正面、拍进或画进图片里的字，全都留着。盖住这些东西是[打码工具](/redact-image/)（英文）的事。
- **Office 文件里图片被裁掉的部分。** 在 Word、Excel 或 PowerPoint 里裁剪图片，只是把边缘藏起来；整张图片仍在文件里，收到文件的人都能撤销裁剪。工具清理图片的元数据，但不碰像素，所以清理后裁掉的部分还在。要去掉它，在 Office 里选中图片，点“图片格式”选项卡上的“压缩图片”，再勾选“删除图片的裁剪区域”；或者把裁好的图片另存为一个新的图片文件，插入那个文件。
- **Office 文件里二进制值编码的内容。** 这些格式把少数值存成编码后的二进制数据：保护工作表或文档的那个密码的哈希值和盐值、墨迹的笔画。这种值是格式正确、长度符合其类型要求的二进制数据时，工具不试图从中读出含义。这类位置上格式不对的值，会和其他文字一样检查并报告；墨迹总是按部件逐个列出。
- **“只清除定位”模式下的相机和姓名。** 这个模式的定义就是去掉地点、留下这次拍摄的其他信息。相机品牌和型号、软件和镜头字段保留，所有者、拍摄者和版权字段也保留。这类姓名字段里有内容时，结果会把它显示在剩下的内容里。相机机身和镜头的序列号在这个模式下也保留，有内容的同样会显示在剩下的内容里，因为它在那台设备拍出的所有照片里都一模一样。
- **色彩配置文件。** 配置文件会保留，因为删掉它会改变颜色，结果会把它列出来。超出标准配置文件通常包含的文字（说明、版权行、设备名称）的其他文字，会单独列成一项，并由 EXIF 查看器显示；工具不改写它。
- **长段文字里少见写法的文件夹路径。** 能识别的：从第一个字符到最后一个字符都是路径的值，或者域代码里一整个带引号的参数。也就是一个根（后面带或不带斜杠的盘符、网络共享、`/`、`~`、小写的 `file:` 地址、环境变量、旧式 Mac 的 `Macintosh HD:`），后面跟着两个或更多名称；不需要文件扩展名。在盘符、共享、个人主文件夹或环境变量之后，两种分隔符可以混着用（`C:\Users\Alice/Documents/a.docx`，为多个系统编写的程序会写出这种路径）；在单独的 `/` 之后，各个名称必须用同一种分隔符隔开。有两种根要求更多，即使整个值只有这条路径也是如此。自己命名的旧式 Mac 磁盘上的路径，只有一直写到带扩展名的文件名才算：`Work Disk:Profiles:Alice:secret.docx` 这样的写法会被认出，`Work Disk:Profiles:Alice:plan` 不能，因为 `IT:Applications:Support` 这类用冒号分隔的标签也是这样写的。首字母大写的 `File:`，只有冒号后面跟着斜杠或盘符才算：`File:Users` 不识别，因为 `File:Flag_of_Japan.svg` 这样的维基页面标题就长这个样子。在较长的文字里，能识别常见写法：盘符后跟斜杠（`C:\` 或 `C:/`）、网络共享（`\\server\share`）、`file:` 地址、`/Users`、`/home` 和其他常见系统文件夹、`~/`、`%USERPROFILE%\Documents` 这样的环境变量路径，以及旧式 Mac 的 `Macintosh HD:Users:…`。可能识别不了的，是长段文字中间写法较少见的路径。一个例子是“见 C:x\Alice\notes”里这种相对于驱动器的写法。另一个是句子中间后面什么都没有的根，比如“稍后去 ~jane/ 找”或“稍后去 \\\\fs01\\ 找”：这时根里写出的账号或机器名不会被挑出来。这种光秃秃的根，只有在它是域代码里一整个带引号的参数时才能识别。识别出的每条路径，要么被缩短，要么被列出。
- **视频里的编码器名称。** 轨道编码为 H.264、H.265 或 ProRes 时，描述里的编码器名称字段会被清空（GoPro 片段里写着“GoPro AVC encoder”，用 FFmpeg 导出的文件里写着“Lavc61.19.101 libx264”），除非它的整个值就只是一个编码格式名（“H.264”“AVC Coding”“HEVC”“HEVC Coding”），这样的保留、也不列出。其他编码格式保留这个字段，并把它列出：有的解码器要读它（FFmpeg 按它选择未压缩视频的像素布局）。编码器或相机软件写名字的其他位置，在清理后的视频里都留着，不论哪种模式：轨道描述和处理器里四个字母的厂商代码、其他编码参数里的文字，以及有些编码器放在画面或声音数据最开头的签名，这些都是解码器要读的部分。改写它们还没有证明对播放是安全的，所以不动。结果会把在文件里找到的名称按原样列出：显示前五个，其余只计数，每个文件最多收集 32 个，太长的在 100 个字符处截断。这样的名称一般说明录制用的是什么程序或什么相机型号。不过，工具不判断文字的意思，编码器的签名里可能不止有名字，比如还有编码这段视频的那台电脑上的文件夹路径。
- **HEIC 里的预览图。** HEIC 作为独立数据项存放的预览图会保留，结果会列出它。以 JPEG 数据项存放、自带元数据的预览图会被清理。在手机上裁剪或编辑过的照片，可能带着一张较早的预览图，显示的仍是改动之前的样子。
- **一段特别长的文字。** 在单个元素里，检查最多保留 4194304 个字符的文字，约 400 万个。含有更长文字的部件照样清理，但列为未检查，不会列为干净。在工具测试用的真实文件里，单个元素最长的一段文字有 39540 个字符。
- **少见布局里的计数。** 在一些少见的布局里，某个姓名或别的项目，计数可能比实际出现的次数多或少，或者在它其实并不存在的地方被列为可能的匹配；不会因此漏掉任何东西。
- **专门做来躲过检查的文件。** 故意构造、想把数据偷偷带过这些工具的文件，可能带着几种工具识别不了或删不掉的形式：没有任何 Office 程序会写出的拼写、填充或编码；互相矛盾或违反格式规则的部件；藏在照片 Photoshop 设置数值里的值，这些数值不会逐项显示；超大的元数据字段，可能拖慢查看器。

## 本站怎样测试

每个版本发布之前，都要经过：

- **单元测试**：针对解析和清理代码，用真实的相机文件和小型合成样本，每个已知的陷阱都有一项测试：JPEG 旋转、WebP 文件头标志、HEIC 数据项位置、视频的 64 位偏移、分段 MP4、多条 GoPro 数据轨、大疆的两种字幕格式、Office 的修订和批注，以及大图降级处理。Office 文件方面，手工构造的文档覆盖 Office 页面列出的每一种结构；只有输出里的识别信息已经消失，或者结果里列出了对应的项目，这个用例才算通过。还有一项测试：独立检查一旦导入清理程序的代码，就判为失败。
- **浏览器测试**：在 Chromium、Firefox 和 WebKit 里，按电脑和手机两种尺寸运行。给每个工具喂样本文件；从选文件到出结果之间，只要出现 GET 以外的任何请求，或者任何发往其他网站的请求，或者控制台报告错误或违反安全策略，测试就失败。
- **对输出的独立检查**：用 ExifTool、ffprobe 和 LibreOffice 检查：工具报告已删除的字段确实没了，文件能正常打开，清理后的照片解码出来和原图像素完全相同，清理后的视频音视频数据包完全一致。清理后的 Office 文件还必须通过微软 Open XML SDK 的验证器，不能出现原文件本来没有的错误。
- **大文件**：在手机模拟环境里测试 4800 万像素的照片、一段 2 GB 的视频和一批 50 个文件。

## 浏览器自己会透露什么

这一页讲的是文件。你的浏览器光是连接网站，就会告诉每个网站一些关于你的事，比如 IP 地址、大致位置、语言和屏幕尺寸。想[看看你的浏览器向网站透露了什么](https://iseeu.cc/)（英文），可以另外做一次检查。

## 资料来源（以下链接为英文）

2026-10-11 核对。

- [Chrome 开发者工具：“网络”面板](https://developer.chrome.com/docs/devtools/network)：记录、“保留日志”和过滤条件。
- [Firefox 网络监视器](https://firefox-source-docs.mozilla.org/devtools-user/network_monitor/)：用 Ctrl+Shift+E 或 Cmd+Opt+E 打开。
- [Apple：启用网页开发者功能](https://developer.apple.com/documentation/safari-developer-tools/enabling-developer-features)：“显示网页开发者功能”这项设置。
- [Cloudflare 文档：Web Analytics 的数据来源和收集](https://developers.cloudflare.com/web-analytics/data-metrics/data-origin-and-collection/)：信标从哪里加载、向哪里报告。
- [GitHub 上的 Open XML SDK](https://github.com/dotnet/Open-XML-SDK)：Office 检查用来比对文件的公开架构数据。

Last updated: 2026-10-17
