宽限期内的编辑会绕过 `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

2 个赞

感谢 @Editor0732 的报告 :+1: 将通过以下链接修复

我尝试部署了这个 PR,并注意到新帖子编辑在媒体审核机制上存在不对称性,我想提出这个问题:

带有媒体的新帖子 — ReviewableQueuedPost(发布前审核)

  • 帖子根本不会创建;内容会停留在可审核的负载中,直到获得批准
  • 作者会在主题页面看到“等待批准”部分(pending_posts
  • 只有在版主批准后,帖子才会对所有人可见(perform_approve_postPostCreator
  • 如果被拒绝,内容将被丢弃——它从未公开过

添加媒体的编辑 — ReviewablePost(先发布,后审核)

  • 编辑立即生效;新版本(包括图片)会立即对所有人可见
  • 作者没有“审核中”的通知——对于宽限期内的编辑,甚至没有修订记录,因此原始内容在界面上不会留下任何痕迹
  • 如果被拒绝,帖子将被删除(perform_reject_and_delete),可以通过之前的修订版本恢复

担忧之处

按照当前的方法,问题图片会在任何版主采取行动之前公开可见,具体时长取决于审核处理时间。这似乎削弱了 skip_review_media_groups 的整个意义——该设置的描述指出,包含媒体的帖子会“发送给工作人员进行审核”,这读起来像是它们在等待审核期间不应公开。

可能的改进方案

  1. 将编辑后的内容放入队列,而不是直接应用。(我认为这个更好) 当编辑引入新媒体时,保持帖子不变,通知作者新的编辑正在等待审核,并在版主批准后才将编辑后的内容应用到帖子上——如果被拒绝则丢弃。这尽可能镜像了新帖子的行为。(在实现方面,这需要一种可审核的变体,其批准操作会对现有帖子执行 revise,而不是创建一个新帖子。)

  2. 当编辑引入新媒体时隐藏帖子,这样只有作者能看到带有“等待批准”通知的帖子,并在批准时使用现有的 perform_approve_and_unhide 操作——ReviewablePost 操作已经支持这一点。

感谢对此进行测试。我同意,整个审核系统并未正确构建以处理“审核/待处理编辑” :thinking:

恐怕这是一项更为复杂的任务,需要更多时间来进行规划和处理。