跳到正文
StartPrivate
菜单
语言:ZH

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

不用光听我们怎么说。浏览器能显示页面发出的每一个请求,看一遍大约只要两分钟。

打开浏览器的开发者工具,切到“网络”面板,清空列表,然后选一个文件并处理:列表里不应该出现带着你文件的新请求,也不应该有发往其他网站的请求。你会看到的请求只来自三处:页面加载、你主动要求的辅助组件(来自本站的模型和 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 在页面里给密码评分;上面说的泄露检查,是唯一可能发出请求的部分。

限制

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

本站怎样测试

每个版本发布之前,都要经过:

浏览器自己会透露什么

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

资料来源(以下链接为英文)

2026-10-11 核对。

最后更新: