ZeroSend——运行在CF Workers上的安全零成本阅后即焚程序
本文发布时对应版本为v2.0.0 Release。
摘要
ZeroSend on Cloudflare Workers— 零成本的自建极简、开源、端到端加密的阅后即焚文件分享程序,基于 Cloudflare Workers + KV (+ R2 +ZeroTrust)。
本项目基于fzxx大佬的Cloudflare-Worker-Secret-doc项目,沿用AGPL-3.0 license,我为项目添加了许多功能,详见下文。
功能对比
| 功能 | 说明 | ZeroSend | 原项目 |
|---|---|---|---|
| 🔒端到端加密 | 使用AES-GCM在浏览器端加密,服务器无法读取明文内容 | ✅ | ✅ |
| 📝Markdown支持 | 支持Markdown格式,含实时预览与代码高亮 | ✅ | ✅ |
| 🖱️ 拖拽文档导入 | 支持将TXT/MD等文档拖拽导入 | ✅ | ❌ |
| 📁文件上传 | 支持上传任意文件(存储于Cloudflare R2) | ✅ | ❌ |
| 🔑可选密码加密 | 支持额外设置访问密码,进行双重加密 | ✅ | ✅ |
| ⏰自动销毁 | 可设置最大查看次数与有效期,到期或次数用尽后自动删除 | ✅ | ✅ |
| 💥手动销毁 | 访问端可选择立即销毁文档 | ✅ | ✅ |
| 📋一键复制 | 生成链接后自动复制,并展示分享二维码 | ✅ | ✅ |
| 📷生成二维码 | 生成链接后自动展示分享二维码 | ✅ | ❌ |
| 🌙深色模式 | 跟随系统配色或手动切换 | ✅ | ✅ |
| 🌐边缘计算 | 基于Cloudflare Workers,全球低延迟访问 | ✅ | ✅ |
| 🛡️请求签名验证 | 前后端HMAC签名,防止伪造请求 | ✅ | ✅ |
| 🔐写端访问保护 | 可配合Cloudflare Access要求登录限制创建/管理权限 | ✅ | ❌ |
| ⚙️管理后台 | 查看、搜索、批量删除有效/历史文档 | ✅ | ❌ |
| 🎛️参数可配置 | 默认查看次数、有效期、文件大小上限等均可在设置页调整 | ✅ | ❌ |
| 🔑通行密钥支持 | 支持FIDO2/OpenPGP的安全密钥/智能卡登录、加密 | 准备中 | ❌ |
🚀 部署教程
前提条件
- 拥有 Cloudflare 账号(免费套餐即可)
第一步:创建 KV 命名空间
- 进入 Cloudflare 控制台 → 存储和数据库 → Workers KV;
- 点击 创建命名空间,名称随意(如
zerosend); - 记录该命名空间的 ID,后续绑定时使用。
第二步:创建 R2 存储桶(用于文件上传,若无需要可不做)
- 进入 Cloudflare 控制台 → 存储和数据库 → R2 对象存储(注意:开启R2需要验证一个支付方式,可以选PayPal或MC/VISA等卡组织卡(银联不可,但内地MC/VISA卡等可以);
- 点击 创建存储桶,名称随意(如
zerosend-files); - 若不需要文件上传功能,可跳过此步。
第三步:创建 Worker
- 进入 Compute(计算) → Workers 和 Pages → 创建 → 创建应用程序,选择从 Hello World! 开始,名称随意,点击部署(这里直接点部署,默认helloworld代码不在这里改);
- 进入刚创建的 Worker,点击编辑代码;
- 将编辑器中的代码全部删除,复制并粘贴本仓库中
ZeroSend.js的全部内容; - 根据需要修改文件头部的
Config对象(见下方说明,可以暂时不填后续补上); - 点击部署。
第四步:绑定 KV 与 R2
- 进入 Worker → 设置 → 绑定 → 添加;
- 添加 KV 命名空间,变量名填
Worker_Secret_doc,选择第一步创建的 KV; - 如启用文件上传,再添加 R2 存储桶,变量名填
Secret_doc_R2,选择第二步创建的存储桶; - 点击保存。
第五步:绑定自定义域名
- 先将域名接入 Cloudflare;
- 进入 Worker → 设置 → 域和路由 → 添加 → 自定义域;
- 填写你的子域名(如
send.yourdomain.com),保存即可通过自定义域名访问。 注:本项目为安全性使用两个域(读写域和只读域),请都添加上去
Config 配置说明
1 | |
🔐 Cloudflare Zero Trust 写端保护(建议开启)
通过 Cloudflare Access 可将创建/管理文档的写操作限制为仅授权用户访问,分享链接的读操作仍对外完全公开,避免有人窃取读写域恶意使用导致你欠Cloudflare一屁股债。
架构示意
1 | |
配置步骤
- 在
Config中填写WriteDomain、CfTeamDomain、CfAccessAudience; - 将写域名和读域名均路由到同一个 Worker;
- 进入 Cloudflare Zero Trust → Access → Applications → Add an application;
- 选择 Self-hosted,Application domain 填写写域名;
- 配置身份验证策略(邮箱、GitHub等);
- 复制应用的 Audience (AUD) Tag 填入
CfAccessAudience,Team domain 填入CfTeamDomain。
向后兼容:
WriteDomain留空时,Worker 行为与单域名模式完全相同。
注:创建Access Application时,请在Authentication选择你要用的登录方式,在Access policies里include你的对应登录账户邮箱。具体操作请见官方文档或网络教程,只要区分好这两个就很简单了。
❓ 常见问题
带预览的即时通讯或邮件会让链接被机器访问而失效,怎么办?
将查看次数设为 2 次或更多;或在 Cloudflare 防火墙中根据 User-Agent / 地区等规则拦截爬虫。
文本大小限制是多少?
单个文档最大 100 KB(由 Cloudflare KV 免费额度决定)。
文件大小限制是多少?
默认最大 100 MB/文件,可在设置页调整(受 Cloudflare R2 及网络条件影响,大文件上传可能中断)。
KV 空间满了怎么清理?
进入 KV 命名空间手动删除,或删除整个命名空间后重新创建并绑定。不设自动清理是因为 API 调用次数有限额。
为什么我上传了文件,但打开链接却没有文件? 你的速度太快了,在提示上传完成后过一会再试试。建议至少为文件开放2次访问次数,其中一次自行查验。
使用方法
在搭建完之后,全部都是前端可视化操作,可以自己探索,程序很简单,只有四个页面:
- 访问端主页:DomainA/
- 写入端主页(写入页):DomainB/
- 写入端管理页:DomainB/admin/
- 写入端设置页:DomainB/settings/
如果你开启了Cloudflare Access(即使用了ZeroTrust),在访问写入端时需要经过配置的Cloudflare Access登录。访问端无需任何登录操作,只需要填写设定的密码即可查看内容。
一个例子
你不可以在这里查看测试实例,密码为
1 | |
它的有效期只有7天,是目前写死的最大时长,后续可能会修改内容如下:
1 | |