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 命名空间

  1. 进入 Cloudflare 控制台 → 存储和数据库Workers KV
  2. 点击 创建命名空间,名称随意(如 zerosend);
  3. 记录该命名空间的 ID,后续绑定时使用。

第二步:创建 R2 存储桶(用于文件上传,若无需要可不做)

  1. 进入 Cloudflare 控制台 → 存储和数据库R2 对象存储(注意:开启R2需要验证一个支付方式,可以选PayPal或MC/VISA等卡组织卡(银联不可,但内地MC/VISA卡等可以);
  2. 点击 创建存储桶,名称随意(如 zerosend-files);
  3. 若不需要文件上传功能,可跳过此步。

第三步:创建 Worker

  1. 进入 Compute(计算)Workers 和 Pages创建创建应用程序,选择从 Hello World! 开始,名称随意,点击部署(这里直接点部署,默认helloworld代码不在这里改);
  2. 进入刚创建的 Worker,点击编辑代码
  3. 将编辑器中的代码全部删除,复制并粘贴本仓库中 ZeroSend.js 的全部内容;
  4. 根据需要修改文件头部的 Config 对象(见下方说明,可以暂时不填后续补上);
  5. 点击部署

第四步:绑定 KV 与 R2

  1. 进入 Worker → 设置绑定添加
  2. 添加 KV 命名空间,变量名填 Worker_Secret_doc,选择第一步创建的 KV;
  3. 如启用文件上传,再添加 R2 存储桶,变量名填 Secret_doc_R2,选择第二步创建的存储桶;
  4. 点击保存

第五步:绑定自定义域名

  1. 先将域名接入 Cloudflare;
  2. 进入 Worker → 设置域和路由添加自定义域
  3. 填写你的子域名(如 send.yourdomain.com),保存即可通过自定义域名访问。 注:本项目为安全性使用两个域(读写域和只读域),请都添加上去

Config 配置说明

1
2
3
4
5
6
7
8
9
10
11
12
13
var Config = {
SharePath: "s", // 分享链接路径前缀,如 /s/<id>
Shareid_control: 2, // 1: UUID,2: 短哈希ID
Max_times: -1, // 最大查看次数,-1 表示不限制
Max_countdown: 10080, // 最长有效期(分钟),10080 = 一周
HmacKey: "风之幻想", // HMAC 签名密钥,建议修改为随机字符串
HomePageCacheDuration: 3600000, // 首页内存缓存时长(毫秒)
BrowserCacheDuration: 86400, // 浏览器缓存时长(秒)
WriteDomain: "", // 写操作专用域名,留空则不限制(单域名模式)
ReadDomain: "", // 生成分享链接时使用的域名,留空则使用请求域名
CfTeamDomain: "", // Cloudflare Zero Trust 团队名
CfAccessAudience: "" // Cloudflare Access 应用 Audience 标签
};

🔐 Cloudflare Zero Trust 写端保护(建议开启)

通过 Cloudflare Access 可将创建/管理文档的写操作限制为仅授权用户访问,分享链接的读操作仍对外完全公开,避免有人窃取读写域恶意使用导致你欠Cloudflare一屁股债。

架构示意

1
2
3
read.yourdomain.com   →  GET /s/<id>               公开,无需认证
write.yourdomain.com → GET / POST /submit
POST /delete/ 需通过 CF Access 认证

配置步骤

  1. Config 中填写 WriteDomainCfTeamDomainCfAccessAudience
  2. 将写域名和读域名均路由到同一个 Worker;
  3. 进入 Cloudflare Zero TrustAccessApplicationsAdd an application
  4. 选择 Self-hosted,Application domain 填写写域名;
  5. 配置身份验证策略(邮箱、GitHub等);
  6. 复制应用的 Audience (AUD) Tag 填入 CfAccessAudienceTeam 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
test

它的有效期只有7天,是目前写死的最大时长,后续可能会修改内容如下:

1
2
3
4
这是一个示例,本服务基于ZeroSend on Cloudflare Workers实现
© tianyimc.com 基于开源项目 开源项目遵循AGPL-3.0 license
感谢fzxx的相关项目,本项目基于此补充。
注:https://secret.tianyimc.com/ 的主页与开源项目主页有区别,本站主页保留所有权利,如有需要获取前端源码,请勿直接抓取本站,而是前往Github本项目主文件ZeroSend-TIANYIMC.js获取。

ZeroSend——运行在CF Workers上的安全零成本阅后即焚程序
https://blog.yimc.top/2026/04/19/opensource-zerosend2_0_0/
作者
yimc
发布于
2026年4月19日
许可协议