[user_review]用户和内容人工审核热
- bbs1org2026-07-09
插件质量报告
插件:
user_reviewHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 page.before_render 全站页面输出前 否 5 - - - 读 plugin_user_review_topics page.head 全站页面 head 否 5 - - - - sidebar.feature_links 首页/侧栏快捷功能 否 5 - - - 读 plugin_user_review_stats sidebar.stack 全站侧栏组件栈 否 5 - - - 读 plugin_user_review_stats security.rate_allow 注册/登录等限流检查 否 4 - - - 读 plugin_user_review_ip_logs topic.index_tabs 首页/版块列表页标签栏(展示位置:首页Tab) 否 4 - - - 读 plugin_user_review_stats login.after_form 登录表单后置区域 否 3 - - - - login.before_submit 登录表单提交前 否 3 - - - - login.form_extra 登录表单 否 3 - - - - register.form_extra 注册表单 否 3 - - - - reply.after_save 回帖保存后 否 3 - - app_topics, app_replies 写 plugin_user_review_topics, plugin_user_review_stats reply.before_save 回帖发布/编辑表单提交 否 3 - - app_topics, app_replies 写 plugin_user_review_topics, plugin_user_review_stats security.rate_hit 注册/登录限流记录 否 3 - - - 写 plugin_user_review_ip_logs topic.after_save 主题保存后 否 3 - - app_topics, app_replies 写 plugin_user_review_topics, plugin_user_review_stats topic.before_save 主题发布/编辑表单提交 否 3 - - app_topics, app_replies 写 plugin_user_review_topics, plugin_user_review_stats user.after_save 用户注册/资料保存后 否 3 - - - 写 plugin_user_review_email_codes user.before_save 用户注册/资料保存前 否 3 - - app_users 写 plugin_user_review_registrations, plugin_user_review_email_codes, plugin_user_review_stats user.profile_tab_header 用户资料页标签内容顶部 回调内 3 - - - 读 plugin_user_review_topics 修正❗️ user.username_reserved 注册/用户资料用户名检查 否 3 - - - - site.closed_allow 站点关闭访问豁免检查 否 2 - - - - topic.form_extra 主题发布/编辑表单 否 2 - - app_topics, app_replies - attachment.before_upload 非系统hook 否 1 - - - 读 plugin_user_review_topics forgot_password.before_submit 非系统hook 否 1 - - - - forgot_password.form_extra 非系统hook 否 1 - - - - profile.settings_tab_content 非系统hook 否 1 - - - - profile.settings_tabs 非系统hook 否 1 - - - - 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_user_review_registrations字段 类型 可空 默认值 约束 id id 否 - 主键、自增 username string 否 - - password string 否 - - email string 否 '' - bio text 否 - - avatar_style string 否 '' - avatar_seed string 否 '' - group_id uint 否 2 - points uint 否 0 - status key 否 'pending' - user_id uint 否 0 - created_at uint 否 - - reviewed_at uint 否 0 - reviewer_id uint 否 0 - plugin_user_review_topics字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - - forum_id uint 否 - - title string 否 - - body text 否 - - status key 否 'pending' - content_type key 否 'topic' - reply_topic_id uint 否 0 - published_id uint 否 0 - reject_reason text 否 '' - created_at uint 否 - - reviewed_at uint 否 0 - reviewer_id uint 否 0 - plugin_user_review_email_codes字段 类型 可空 默认值 约束 id id 否 - 主键、自增 email string 否 - - code_hash string 否 - - ip string 否 '' - used_at uint 否 0 - expires_at uint 否 - - created_at uint 否 - - plugin_user_review_password_resets字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - - token_hash key 否 - 唯一 expires_at uint 否 - - used_at uint 否 0 - created_at uint 否 - - plugin_user_review_ip_logs字段 类型 可空 默认值 约束 ip key 否 - 主键 register_count uint 否 0 - register_at uint 否 0 - login_fail_count uint 否 0 - login_fail_at uint 否 0 - reset_fail_count uint 否 0 - reset_fail_at uint 否 0 - created_at uint 否 - - updated_at uint 否 - - plugin_user_review_stats字段 类型 可空 默认值 约束 id uint 否 - 主键 registrations uint 否 0 - contents uint 否 0 - rejected_contents uint 否 0 - registration_latest_at uint 否 0 - content_latest_at uint 否 0 - updated_at uint 否 0 - - bbs1org2026-07-09
支持邮箱后缀限制,后台为单行输入框
邮箱后缀不匹配时明确提示支持的后缀
审核模式:
关闭审核
用户前 X 个主题/回帖审核
用户注册需要审核
主题审核数、回帖审核数分开配置和判断
注册审核通过后才正式创建用户
待审核内容进入后台审核队列
首页侧边栏给管理员显示待审核卡片
审核队列 UI 修正,参考签到卡片风格
审核通过/拒绝改为 Ajax,成功后当前行自动消失
审核结果通知用户,主题/回帖通知包含标题并链接到已发布内容 最有价值必须安装的插件
确实好用
@bbs1org 已按 topic/245 完成 1.3.0 整改:新增
content_kind并兼容迁移旧content_type,移除 MySQL 专用列修改,已验证旧数据迁移。平台不允许非原作者更新同 ID,修正版源码:确实不错👍
- bbs1org2026-08-12
调整注册页的邮箱验证码会移动到邮箱输入框正下方
- bbs1org2026-08-12
已修复:AJAX 发布审核提示只在当前响应显示,不再写入 flash Cookie;浏览器返回页面不会重复弹出。
- 1234567892026-08-12
- 1234567892026-08-12
- bbs1org2026-08-12
- bbs1org2026-08-12
优化虚拟发送邮件提示细节
- 1234567892026-08-12

在这个 用户审核 里面填写了正确的 smtp 信息,没办法实现发送验证码
让ai做了个 smtp 探针测试,数据填写都是一样的,结果没问题,能收到邮件。是什么情况?
最后编辑于 2026-08-12 16:54- bbs1org2026-08-12
- bbs1org2026-08-12
🔍 插件审查报告(对照《AI 开发规则》与开发者文档)
🔒 安全问题
- 邮箱验证码可被爆破:
user_review_check_email_code(plugin.php:648-656)只校验 6 位数字码,验证尝试无次数/频率限制(仅发送侧 624-629 按 IP 限频)。攻击者可反复提交穷举验证码,绕过注册或改邮箱的邮箱归属校验。建议对验证码校验加按 IP/邮箱的失败计数与锁定(如连续 5 次失败锁定一段时间)。
⚡ 性能问题
未发现明显问题。
🐛 功能/规范缺陷
- 无效 Hook:manifest 注册
attachment.before_upload(plugin.php:1613),但核心源码无此钩子触发点,导致「审核中/已拒绝内容禁止上传附件」功能永不生效。建议核对核心真实上传钩子名后修正或移除。 - 私有钩子缺前缀:
forgot_password.before_submit/forgot_password.form_extra(plugin.php:396/420、1605-1606)为插件自定钩子,却无user_review.前缀。建议改为user_review.forgot_password.*并同步 fire 处。 - 后台写操作未
require_post():user_review_admin_page(plugin.php:1402)手动判断 REQUEST_METHOD,建议改用require_post()。 - 跨库 upsert 手写:
user_review_rate_hit(153-160)手写 MySQLON DUPLICATE KEY+IF()与ON CONFLICT分支,建议改用app_db_upsert()/app_db_insert_ignore()。
✅ 修复优先级
先修验证码爆破限制 → 修正无效/私有 Hook 命名 → 其余规范项统一。
- 邮箱验证码可被爆破:
- bbs1org2026-08-24
版本 1.6.15 更新:
优化细节体验 - bbs1org2026-08-26
版本 1.6.18 更新:
后台“安全限制”新增可配置项:- 注册用户名最短/最长长度,范围 1-20
- 注册密码最短长度,范围 4-128
默认规则为用户名 3-20 个字符、密码至少 6 位。注册提交时会在写入待审表前校验;OAuth 注册不要求本地密码。配置反向时会自动将最长长度收敛到不小于最短长度。
队列统计改为增量维护,避免审核、拒绝、删除时反复全表 COUNT/MAX。
新增拒绝队列和个人审核列表所需索引。
后台与个人审核列表仅加载正文预览,点击单条后才读取全文。
通配关键词改为线性片段匹配,避免长正文触发正则回溯。
“已查看”状态仅在存在新待审内容时写入设置。 - bbs1org2026-08-27
版本 1.6.19 更新:
“安全限制”中,注册、登录错误、密码找回错误各自可设置:- 限制时长,单位分钟,1-10080
- 限制次数,1-100
默认保持原行为:60 分钟,注册 1 次,登录/找回密码错误各 5 次
- 1234567892026-08-27
发布审核和发布审核模式啥意思,还有前几个发布是啥意思啊😅
- bbs1org2026-08-27
- 1234567892026-08-27
- 1234567892026-08-27
- bbs1org2026-08-27
版本 1.6.21 更新:
已修正文案,配置含义更直观:- “开启用户审核”改为“新用户注册需要审核”,并说明审核通过后才能登录发言。
- “发布审核模式”改为“新用户发帖审核范围”。
- “前几个发布”改为“审核次数设置(主题和回帖合计)”,并说明 N 的计算方式。
- “发布审核”改为“审核时机”,明确区分“审核通过后公开”和“先公开,不通过时下架”。
- Cloudflare 验证码的“前几个发帖”文案也同步明确。
🔁 复核回帖(AI 自动核对,对照 8/18 楼上 350 的审查报告与当前 v1.6.21 源码)
结论:350 原报告共提出 4 项问题(含 1 项在本次核对中发现属误判,予以更正),逐条核对如下:
- 邮箱验证码可被爆破:
user_review_check_email_code()(plugin.php:730-737)仍只做格式校验(6 位数字)+password_verify()比对,未见按 IP/邮箱的验证失败计数或锁定逻辑。发送侧仍只限制发送频率(同 IP 间隔分钟数可配),验证提交侧无限次尝试限制依旧存在。
- 更正说明:8/18 报告称
attachment.before_upload(plugin.php:1782)为"无效 Hook",经本次核对该结论有误——该 Hook 由另一插件attachment_upload(附件上传)在其上传流程中定义并调用(非核心 index.php 直接提供),只要两个插件同时启用,user_review_attachment_before_upload()确实会被触发,功能有效。特此更正,避免误导。
- 私有 Hook 缺插件前缀:
forgot_password.before_submit、forgot_password.form_extra(plugin.php:426/450,manifest 1774-1775 行)仍未加user_review.前缀。
- 后台写操作手动判断请求方式:
user_review_admin_page()三处(plugin.php:423/464/1538)仍是$_SERVER['REQUEST_METHOD'] === 'POST',未改用核心require_post()。
5.(350 原报告第4条)跨库手写 upsert:
user_review_rate_hit()(plugin.php:173-191)仍手写 MySQLON DUPLICATE KEY+IF()与 SQLite/PGON CONFLICT分支,未改用app_db_upsert()。补充核对:v1.6.18/1.6.19 新增的限流参数可配置化(各 bucket 独立的时长/次数)读取时均有
max(1,min(...))上下限夹取,未见新引入的边界问题。第 1、3、4、5 项问题延续自 8/18 报告、仍未修复;第 2 项经核对为原报告误判,已更正。本次核对未发现新增问题;建议优先处理第 1 项(验证码爆破,属安全类),其余为规范/功能类,按原优先级修复即可。
- 邮箱验证码可被爆破:
自动停用原因
2026-08-28 13:14:05 PDOException: SQLSTATE[42702]: Ambiguous column: 7 ERROR: column reference "login_fail_at" is ambiguous LINE 1: ...LICT(ip) DO UPDATE SET login_fail_count=CASE WHEN login_fail... ^ (index.php:286)- bbs1org2026-08-28
- bbs1org2026-08-28
版本 1.6.22 更新:
已修复 PostgreSQL 的 UPSERT 字段歧义。
login_fail_at 现明确引用为 plugin_user_review_ip_logs.login_fail_at,避免与 excluded 记录冲突 - bbs1org2026-08-28
版本 1.6.23 更新:
用户名命中“待审关键词”会强制进入注册待审队列。
用户名命中“拒绝关键词”会直接拒绝注册。
拒绝关键词优先于待审关键词。
后台两项关键词的说明已明确包含新注册用户名。
OAuth 用户命中待审关键词时给出明确提示,避免进入本地密码流程。 - bbs1org2026-08-28
版本 1.6.23 更新:
添加预览 - bbs1org2026-09-07
版本 1.6.24 更新:
优化体验 - bbs1org2026-09-09
版本 1.6.26 更新:
修复 OAuth 冲突问题 - bbs1org2026-09-12
版本 1.6.27 更新:
采用个人设置新hook - bbs1org2026-09-14
版本 1.6.30 更新:
优化人机验证体验 - code2026-09-14
- bbs1org2026-09-14
CloudflareTurnstile和Cap那个好用一点
- bbs1org2026-09-15
- bbs1org2026-09-21
版本 1.6.30 更新:
支持v10 - bbs1org2026-09-21
版本 1.6.31 更新:
更新版本号
