摘要
“审查媒体”检查(skip_review_media_groups 站点设置)仅在帖子创建时通过 NewPostManager 执行。编辑操作通过 PostRevisor 进行,后者从不运行媒体检查。因此,用户可以先发布纯文本(通过审查),然后通过编辑添加图片——而该帖子永远不会进入审查队列。
更糟糕的是,如果编辑发生在 editing_grace_period(默认 5 分钟)内,且差异小于 editing_grace_period_max_diff(默认 100 个字符——单个上传图片的 Markdown 行约为 40–60 个字符),则编辑不会创建修订记录,也不会显示铅笔图标,因此该绕过行为在 UI 中完全不可见。
复现步骤
- 配置
skip_review_media_groups,使普通用户(例如 TL0/TL1)不被豁免——包含媒体的帖子应需要审批。 - 作为普通用户,创建一个仅包含文本的帖子。它会被正常批准/发布(无媒体 → 无需审查)。
- 在宽限期内,编辑该帖子并插入一张上传的图片。
预期结果
该帖子(现在包含媒体)应被发送到审查队列,或者至少该编辑应接受与帖子创建时相同的媒体检查。
实际结果
- 该帖子连同图片一起发布,且从未进入审查队列。
- 未创建修订记录,也未显示编辑指示器。
证据(生产实例)
p.version # => 1
PostRevision.where(post_id: p.id).count # => 0
p.created_at # => 2026-07-30 07:33:28 UTC
p.updated_at # => 2026-07-30 07:34:00 UTC
UploadReference.where(target: p).pluck(:created_at)
# => [2026-07-30 07:34:01 UTC]
纯文本文字于 07:33:28 创建,约 32 秒后通过编辑添加图片——无可见编辑历史,无审查。
相关代码
- lib/new_post_manager.rb —
post_needs_approval?通过contains_embedded_media?返回:contains_media,但这仅对新帖子运行。 - app/models/post_analyzer.rb#embedded_media_count — 媒体计数逻辑。
- PostRevisor — 编辑时没有等效的媒体检查。
建议的修复方案
在 PostRevisor 中也运行 contains_media 检查(当编辑引入媒体且编辑者不在 skip_review_media_groups 中 / 不是工作人员时),为已编辑的帖子排队一个 ReviewablePost。