控制项复核 · 2026 年 7 月 28 日
邮箱保留控制审计
“到期”和“已经删除”不是同一个事件。本审计逐项对应当前应用与 SMTP 配置,避免隐私说明把“停止访问并进入清理”误写成毫秒级即时抹除。
当前代码与仓库默认值
| 控制项 | 数值 | 含义 |
|---|---|---|
| 邮箱会话窗口 | 1 小时 (3600s) | 地址可使用到服务端 expiresAt,界面倒计时展示当前值。 |
| 默认延长次数 | 1 次 | 每次成功延长会增加一个邮箱窗口;生产环境可覆盖该值。 |
| 会话记录缓冲期 | 600 秒 (600s) | Redis 会话和地址映射在访问到期后短暂保留,以便安全清理陈旧状态。 |
| SMTP 原始正文 TTL | 1 小时 (3600s) | 仓库中的 SMTP 配置用该 SETEX 时长保存 Redis 邮件正文。 |
| SQL 清理锁 | 60 秒 (60s) | 新会话请求可以触发清理,Redis 锁用于限制并发扫描。 |
按执行顺序排列的生命周期
1. 创建会话
API 使用密码学随机数创建 16 字节会话 ID 和默认 8 位十六进制前缀。ID 写入 HttpOnly、SameSite=Strict Cookie,生产环境再加 Secure。Redis 会话与地址映射保留到界面到期时间加一段清理缓冲。
2. 收信与可见性
SMTP 进程把路由元数据写入 SQL,并可按配置 TTL 把原始正文放入 Redis。收件箱 API 要求匹配的会话 Cookie,拒绝过期会话,只返回最近一个配置窗口内的邮件。延长地址会延长会话,但不会延长早先邮件的年龄。
3. 延长
若配置允许,expiresAt 向后增加一个邮箱窗口。本次审计修正了 Redis TTL 的计算:映射现在会保留到延长后的到期时间加缓冲,不再错误地按固定单窗口提前消失。
4. 到期
超过 expiresAt 后,API 停止返回收件邮件,并在下一次相关请求时清除浏览器 Cookie。到期是访问控制边界,不代表每条 SQL 记录和基础设施日志在同一毫秒被删除。
5. 清理或手动删除
创建新邮箱时可获取一分钟 Redis 锁,删除早于一个邮箱窗口的 SQL 邮件记录。用户也可以更早删除指定记录。Redis 原始正文按 SMTP SETEX 独立到期;有限基础设施日志则受服务商、安全、稳定和法律保留需求约束。
本次复核确认的控制项
- 会话 Cookie 使用 HttpOnly、SameSite=Strict、路径 /,生产环境启用 Secure。
- 过期会话无法通过收件列表过程读取邮件。
- 收件箱查询要求会话收件地址与邮件记录匹配。
- 会话和地址键使用会过期的 Redis 记录,不是永久键。
- 手动删除邮件在服务端执行数据库删除。
- 首页和邮件阅读界面没有 AdSense 组件,不会把私人邮件与广告并列。
本审计不能证明什么
- 没有查看生产 Redis、SQL、托管、备份或日志控制台。
- 环境变量可以改变邮箱窗口和延长次数;访客当前会话以实时倒计时为准。
- 删除 TmpKit 副本无法撤回发件人、网络中间方、已下载设备或其他备份周期中的副本。
- 运营层仍需抽样核对生产 TTL 和清理遥测,但不得暴露邮件内容。