宽限期内的编辑会绕过 `skip_review_media_groups` 媒体审核

摘要

“审查媒体”检查(skip_review_media_groups 站点设置)仅在帖子创建时通过 NewPostManager 执行。编辑操作通过 PostRevisor 进行,后者从不运行媒体检查。因此,用户可以先发布纯文本(通过审查),然后通过编辑添加图片——而该帖子永远不会进入审查队列。

更糟糕的是,如果编辑发生在 editing_grace_period(默认 5 分钟)内,且差异小于 editing_grace_period_max_diff(默认 100 个字符——单个上传图片的 Markdown 行约为 40–60 个字符),则编辑不会创建修订记录,也不会显示铅笔图标,因此该绕过行为在 UI 中完全不可见。

复现步骤

  1. 配置 skip_review_media_groups,使普通用户(例如 TL0/TL1)被豁免——包含媒体的帖子应需要审批。
  2. 作为普通用户,创建一个仅包含文本的帖子。它会被正常批准/发布(无媒体 → 无需审查)。
  3. 在宽限期内,编辑该帖子并插入一张上传的图片。

预期结果

该帖子(现在包含媒体)应被发送到审查队列,或者至少该编辑应接受与帖子创建时相同的媒体检查。

实际结果

  • 该帖子连同图片一起发布,且从未进入审查队列。
  • 未创建修订记录,也未显示编辑指示器。

证据(生产实例)

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

1 个赞