03 / 指南
如何验证在线工具没有上传你的文件
一份免费的方法论指南:用浏览器的网络面板和带金丝雀字符串的测试文件,检查在线工具是否上传你的文件,并说明缓存与 Service Worker 的注意事项。然后看同样的方法如何以 Toolars 公开的、可重复运行的证据 harness 形式运转,附带每日重新采集的回执。
为什么要验证而不是相信
处理方式是可检验的。任何工具都可以说你的文件不会离开设备;只有当真实任务中的网络流量可以观察、可以复现时,这个主张才成为证据。本指南教你一个方法——在工具工作时观察浏览器发出了什么——然后展示同样的方法如何作为长期公开的工件运转,让关于 Toolars 的主张可以被核查,而不是被相信。
- 承诺与证据标签是承诺,抓包是证据;区别在于抓包可以重放、检查和质疑。
- 一个方法,任何工具方法与工具无关:它在浏览器自带的网络面板中运行,大约需要一分钟,适用于你想测试的任何网站。
- 先在自己身上验证本指南不点名任何其他服务,也不对任何其他网站的行为做任何断言;它教你检查方法,然后用 Toolars 自己公开的证据做示范。
六十秒的 DevTools 检查
每个桌面浏览器都带有网络监视器,记录页面发出的每个请求。按正确的顺序使用,它直接回答上传之问:有没有请求带着我的文件离开这台设备?
在完成工作并下载结果时保持面板记录。证据的单位是整个会话:上传只能发生在请求之内,而请求无法躲过完整的日志。
- 先打开并清空先打开工具的页面和网络面板——开发者工具,然后 Network 标签——清空日志并保持记录。加载页面总会产生 HTML、脚本和样式的请求;这种页面壳流量是预期之内的。
- 用可牺牲的文件试用专门为这个目的制作的测试文件执行任务:转换、旋转、压缩。干净的初始日志意味着你看到的每个请求都属于你的任务。
- 观察操作按下工具的操作并观察列表。本地工具可能在首次使用时获取代码、字体或引擎资源——而在预热运行之后,理想情况下什么都不发生。
读日志:页面壳的流量不是你的文件
关键技能是区分页面流量和数据流量。页面壳流量把应用送到你的浏览器;数据流量把内容运走。知道要看什么之后,两者在面板里看起来非常不同。
- 页面壳请求页面壳请求体积小、可缓存,名字像软件——脚本、样式、字体和引擎文件,位于网站自己的路径下。它们把代码送到你的设备;不会把你的文件带到任何地方。
- 上传的特征上传看起来像一个 POST、PUT 或 multipart 请求,其正文大致与你的文件等大,发往与页面不同的源。如果按下转换的瞬间有这样的请求飞出,文件就离开了设备。
- 打开查看体积本身在两个方向上都不构成证明:压缩分块、可断点续传的会话和 WebSocket 都可能把一次传输拆开。证据在请求的方法、目的地和载荷里——打开它,看。
缓存和 Service Worker 会改变你看到的东西
网络日志测量的是这个浏览器状态下的这一次运行——而浏览器状态正是缓存和 Service Worker 存在的意义去改变的东西。读好日志意味着控制这个状态。
- 预热是正常的重复访问时,已预热的网站会从磁盘或 Service Worker 提供页面壳,面板显示的请求远少于第一次。预热后请求变少是健康的本地工具的样子——它本身不是任何事的证明。
- 从干净状态开始为了读得干净,请从新的浏览器配置文件或无痕窗口开始,启用面板的禁用缓存选项,并记住无痕模式并非在每个浏览器都会拦截 Service Worker。
- 拦截 Worker最强的抓包让每次运行都从禁用 Service Worker 的新浏览器上下文开始,这样没有任何东西从缓存提供,也没有任何请求在面板记录之前被拦截。下面的公开 harness 正是这样记录的。
金丝雀检查:给文件做记号,再搜索
比观察流量更进一步的决定性升级:给测试文件一个唯一记号——金丝雀字符串——然后在抓取的请求中搜索这个精确的字符串。如果这些字节没有出现在任何请求中,文件就没有离开。
这是非专业人士手中最有说服力的技术,因为它检验的是字节本身,而不是工具的意图。
- 做记号制作一个可牺牲的文件,嵌入你自己生成、从未公开的记号:文本图层、图片注释、PDF 便签里的随机 UUID。唯一性让一次命中才有意义。
- 搜索流量任务完成后,在面板抓取的请求中——URL、查询字符串和正文——搜索该记号。命中意味着文件的字节离开了设备;整个会话都没有命中,就是它们没有离开的有力直接证据。
- 重复检查金丝雀只覆盖你观察到的会话——这就是为什么定期、重复的抓取比一次细致的手工检查更重要。
Toolars 公开的关于自己的证据
Toolars 把同样的方法作为长期公开的工件运行:每个工具的带类型处理声明、带抓取流量的 Privacy proof 页面,以及一份机器可读的回执——它陈述自己的局限和陈述结果一样坦率。
- 已披露的主机Privacy proof 页面列出了站点页面壳可达的每个外部主机、随响应提供的安全标头,以及可以在同一个网络面板中手工执行的自我验证步骤。
- 机器可读回执/privacy-proof/verification-receipt.json 的机器可读验证回执公开了验证命令、各场景的实测结果、已披露的外部主机,以及用于与站点 X-Toolars-Release 响应标头比对的发版修订号。
- 坦白的局限这份回执说它不能证明什么和它证明了什么一样清楚:被测量的窗口只覆盖那一次运行,而不是对服务未来一切行为的审计。
公开证据 harness 和它的四个场景
同样的检查被打包成开放仓库中可运行的 harness,因此对本地处理的主张可以在不向 Toolars 索取任何东西的情况下得到验证。它驱动线上站点,记录包括 Worker 请求在内的每个请求,一旦有边界被跨越就响亮地失败。
harness 位于公开仓库 https://github.com/aixtral/toolars-open 的 evidence-harness/ 目录下。它以 MIT 许可证发布,验证的是已部署的站点——主张真正所指的对象——而不是私有的暂存副本。
- 四个场景harness 在无头 Chromium 中驱动线上站点跑四个场景:带下载的图片转换;HEIC 转换——预热解码器后的实测运行必须发出零请求;带第二语言包的 OCR 任务——语言包必须从站点自己的源到达;以及在自带样本上的 PDF 旋转。
- 三条不变量在每个实测窗口内,它坚持三条不变量:上传请求为零;金丝雀泄漏为零——输入文件的字节中带有随机记号;超出站点自己披露的第一方分析代理之外的意外跨域请求为零——那个代理不是被忽略,而是被计数、被点名。
- 每日重新采集一个计划任务每天对线上站点重新采集回执,仓库的隐私证明徽章只有在最新回执的结果为 verified 时才为绿色;失败的运行读作 violation 或 inconclusive,绝不会悄悄变绿。
自己重跑证明
回执的价值与它的可复现性相当。harness 的构建目标是让任何人都能以线上站点为目标运行它,并把结果写入一个可以逐行检查的文件。
由于每个场景都从禁用 Service Worker 的新浏览器上下文开始,零请求的读数意味着它看起来的意思:预热之后,实测运行完全没有触碰网络。
- 克隆并验证克隆仓库,进入 evidence-harness/,安装它的依赖和 Playwright 的 Chromium,然后以线上站点为目标源运行 verify 脚本。
- 退出码就是裁决运行会写出 privacy-proof-receipt.json;如果有任何意外跨越边界——带正文的请求、URL 中的金丝雀、或者不在站点公开名单上的主机——就以非零码退出。
- 只有元数据回执只记录请求元数据——方法、主机、路径、资源类型、是否带正文——绝不记录文件内容、请求正文或响应正文。
这个方法不能证明什么
诚实的验证包含它自己的边界。知道这些边界,可以避免把一条干净的网络轨迹误读为它从来都不是的保证。
- 一个窗口干净的轨迹覆盖被观察的会话——那一次运行、那个浏览器、那个文件。它不审计提供商的服务器、人员或未来的代码。
- 你的设备很重要从你的设备离开什么,也取决于你的设备:被攻陷的浏览器、恶意扩展或共享配置文件,都可能脱离任何工具架构独立地搬运数据。
- 常设证据把每个隐私主张——包括本站的主张——都当作会被重复采集的常设证据,而不是终身保证。这正是 harness 按计划重跑、而不是躺在一次漂亮抓取上的原因。
查看常设证据。
带类型的运行时声明、抓取的流量、已披露的主机和机器可读回执——每天对线上站点重新采集。