审核流程
MODERATION_REQUIRED 控制是否开启人工审核,默认 true。
开启审核(默认)
待审数据不写入任何存储,只存在于审核邮件的 URL fragment 里。
为什么批准必须是 POST
邮件安全网关会预抓取邮件里的链接。如果批准动作是 GET,扫描器会替你批准。因此链接只打开预览页,真正的写入是页面里的 POST。
URL fragment 存储
密文放在 #token= 后面而不是查询串里:
- fragment 不会发送到服务器,不进访问日志
- 长度限制几乎不存在(Chrome / Firefox 可承载数 MB)
- 审核页加载后立即用
history.replaceState清除,防止 Referer 泄露
凭据规则
- 内容绑定签名(HMAC-SHA256)
- 7 天有效期
- 一次性内容幂等:同 id 同内容重复批准不会重复写入;同 id 不同内容返回 409 且不覆盖
关闭审核
设置 MODERATION_REQUIRED=false:
此时:
- 不发任何邮件,
MODERATOR_EMAIL与发件配置不再必填 - widget 成功文案变为「留言已发布,约 1 分钟后可见」
/api/health返回moderation: false并附警告
风险:Turnstile 一旦失效或被绕过,陌生人可以直接往目标仓库写文件。同仓库模式下后果更严重。若无法承担该风险,请保持审核开启。
表单知情同意
无论审核是否开启,表单都要求勾选:
我同意昵称和留言经审核后公开,并保留在公开 Git 仓库的历史记录中。
删除评论只能删除当前版本,Git 历史中的记录仍然存在。这一点必须让评论者知情。