2024 年某安全研究员分析了 20 个”免费 PDF 合并”网站,发现其中 17 个把用户上传的文件存到了 CDN 的临时存储,其中 3 个在 24 小时后还没删除。也就是说,你今天上传的合同、病例、简历,明天还在别人硬盘上,只是你不知道而已。

PDF 是一个非常特殊的隐私数据类型 — 它经常包含你最敏感的内容:身份证扫描、合同、工资单、病例、护照、成绩单。但又因为它”看起来就是个文档”,心理防线比裸照片低。本文用 3 个真实的隐私事故案例,讲清楚为什么我们坚持所有 PDF 处理在浏览器本地完成,以及你怎么验证你用的工具是不是真的本地处理。

3 个真实的事故

事故 1:某知名 PDF 在线工具的 S3 桶泄漏(2023)

一家被很多人推荐的”免费 PDF 合并”网站,被安全研究员发现它在 AWS S3 上存了200 万份用户上传的 PDF,桶配置错误导致公开可访问。其中包含可以被关联回真实身份的:律师函、医院出院小结、学位证书。

根本原因: 工程团队用了 S3 临时存储做”加速缓存”(CDN 没配好),但桶的 IAM 权限设成 public-read。工具本身的”上传”按钮没说会上传到 S3,只说”上传到云端处理”。

用户本可以做但没做的事: 上传前,点 F12 看 Network 标签,如果看到 POST 请求去第三方域名,工具不是纯前端。

事故 2:某”匿名化”PDF 工具的黑盒擦除(2024)

一家号称”上传病历,自动匿名化所有姓名地址”的工具,被工程师发现它的”匿名化”只是视觉遮盖(在姓名上画黑条),原始文本流里姓名还在。任何会 PDF 反向工程的人都能拿到原文。

根本原因: 真匿名化需要改 PDF 内容流(用 pdf-lib 这种库重写对象),但视觉遮盖是 1 行代码(在页面上画矩形)。低成本实现 vs 高成本实现,选哪个是商业决策。

用户本可以做但没做的事: 上传一个虚构的”测试病例”里写满 测试姓名 test-name,然后传回下载,用 PDF 编辑器看文本流。真匿名化的 PDF 应该全文搜不到任何姓名

事故 3:某 OCR 服务的扫描 + 训练数据争议(2025)

某 AI 驱动的”OCR PDF 转 Word”工具在用户协议里写了:“上传的文件可能被用于改进我们的 AI 模型”。法律上这是允许的(用户同意了 EULA),但没有任何用户在上传前意识到自己上传的合同在训练某个 AI

根本原因: “免费工具换数据”的商业模型。免费工具不卖广告(广告主不愿意花钱投 OCR 工具),所以转卖数据。

用户本可以做但没做的事: 上传前翻到用户协议的”数据使用”那一段,通常藏在中间。法务角度,如果数据用于”服务改进”,这通常包含训练模型。

我们为什么坚持本地处理

Piick PDF 工具 的设计原则只有一条:文件不出浏览器

技术层面的实现:

  • 所有 PDF 操作在浏览器进程的内存里完成,使用 pdf-lib(/src/components/tools/PdfTools.astro)
  • 文件对象不会被包装成 fetch 的 FormData
  • 按钮点击不会触发任何网络请求
  • 处理完的文件直接生成 blob: URL,这个 URL 是浏览器沙箱内部的,外部世界看不到

设计层面的诚实:

  • 我们的隐私页面明确写”不上传、不存储、不训练”。这是承诺,不是营销话。
  • 我们的代码是静态站,没有后端服务器可以上传到(域名 piick.cc 只是 HTML + JS + CSS 静态文件托管,JetBrains 做的 Astro 4.x build output + CDN 缓存)。
  • 我们没有”账号体系” — 无需注册,无需登录,无需邮箱。

怎么验证你用的工具是不是真的本地处理

如果你在用别家的 PDF 工具,做这 3 步验证:

步骤 1:DevTools Network 监控

打开浏览器的开发者工具(F12),切到 Network 标签,清空记录。然后用它做一次 PDF 合并。

  • 真本地: Network 标签应该有零 POST/PUT 请求(除了页面首次加载的 HTML/CSS/JS)
  • 假本地: 你会看到上传请求去一个陌生域名(/api/upload.pdf 之类)

步骤 2:防火墙断网测试

把电脑的网络断开(飞行模式或者拔网线),然后再用工具做一次 PDF 合并。

  • 真本地: 完全正常工作,生成新 PDF
  • 假本地: 报错”网络连接失败”

步骤 3:看代码(对工程人员)

按 F12 切到 Sources 标签,搜 PDF 处理的函数(mergePdfsplitPdf)。如果函数体内没有 fetch(XMLHttpRequest 调用,就是纯前端。如果有,搜这些 fetch 的 URL,看它们去不去你自己的域 — 如果去到 *.example.com,可能上传了。

3 个边界情况要小心

边界 1:Chromium 扩展

如果工具是浏览器扩展(Chrome Extension、Firefox Add-on),它的”本地处理”取决于扩展本身有没有网络权限。检查扩展设置: 一些扩展默认有 <all_urls> 权限,即使不上传也会读你的页面。

边界 2:PDF 文件本身已经在云端

如果你处理的 PDF 是从 Google Drive、Dropbox 下载的(临时 URL),那么”本地处理”完成后,文件临时 URL 的访问日志还是在 Google/Dropbox 那边。这不是工具的锅,但要意识到。

边界 3:PDF 阅读器插件

有些 PDF 阅读器(Adobe Reader DC)有”快速分享”功能,会在你打开文件时主动 ping 一下 Adobe 服务器。和工具无关,但你打开 PDF 这个动作可能已经有数据外泄。

推荐做法

  1. 敏感 PDF 用本地工具 — 合同、病例、身份证扫描,永远用纯前端工具(我们推荐自己做的 PDF 工具,但你选的任何纯前端工具都行)。
  2. 不敏感 PDF 才用云端 — 公开的会议议程、公开的论文、教材,云端工具无所谓。
  3. 每年清空一次云端工具账号 — 如果你用过 ilovepdf、smallpdf 之类的账号,里面可能有上传历史。登录后看”我的文件”,主动删除。
  4. 重要的 PDF 不要”分享到社交媒体”按钮一键处理 — 这种工具几乎都是云端处理。

我们做了 PDF 工具 是因为这件事对自己重要,不是觉得别人做不好。是真的想给所有人一个”无需信任也能用”的 PDF 处理选项。