• bbs1org
    用户和内容人工审核
    ID user_review版本 1.6.31插件制作者 bbs1org免费2116 行 / 146.2 KBHook / 路由 / 后台页
    审核新用户和发布内容,并向用户提示审核结果,支持用户查看、编辑或删除自己的审核内容,注册、登录和发帖支持接入人机验证。
    app/plugins/user_review/plugin.php
    开发日志最新 10 条

    个人独立维护项目。

    • bbs1org
      bbs1org
      版本 1.6.31 424f6062a812 更新:更新版本号release
    • bbs1org
      bbs1org
      版本 1.6.30 6f14401d64b5 更新:支持v10
    • bbs1org
      bbs1org
      版本 1.6.30 bb3c568363bd 更新:优化人机验证体验
    • bbs1org
      bbs1org
      版本 1.6.27 539463bd836b 更新:采用个人设置新hook
    • bbs1org
      bbs1org
      版本 1.6.26 aea32b32f1a2 更新:修复 OAuth 冲突问题
    • bbs1org
      bbs1org
      版本 1.6.24 3002a40a43da 更新:优化体验
    • bbs1org
      bbs1org
      版本 1.6.23 5e628553d8f3 更新:添加预览
    • bbs1org
      bbs1org
      版本 1.6.22 0d0822f42af7 更新:已修复 PostgreSQL 的 UPSERT 字段歧义。 login_fail_at 现明确引用为 plugin_user_review_ip_logs.login_fail_at,避免与 excluded 记录冲突
    • bbs1org
      bbs1org
      版本 1.6.21 320bea70d775 更新:已修正文案,配置含义更直观: - “开启用户审核”改为“新用户注册需要审核”,并说明审核通过后才能登录发言。 - “发布审核模式”改为“新用户发帖审核范围”。 - “前几个发布”改为“审核次数设置(主题和回帖合计)”,并说明 N 的计算方式。 - “发布审核”改为“审核时机”,明确区分“审核通过后公开”和“先公开,不通过时下架”。 - Cloudflare 验证码的“前几个发帖”文案也同步明确。
    • bbs1org
      bbs1org
      版本 1.6.19 1f7b30f0e7b6 更新:“安全限制”中,注册、登录错误、密码找回错误各自可设置: - 限制时长,单位分钟,1-10080 - 限制次数,1-100 默认保持原行为:60 分钟,注册 1 次,登录/找回密码错误各 5 次
    主楼
  • 质量报告

    插件质量报告

    插件:user_review

    Hook功能范围循环使用频率文件读写修改系统表读写系统表读写自己的表
    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

    字段类型可空默认值约束
    idid否-主键、自增
    usernamestring否--
    passwordstring否--
    emailstring否''-
    biotext否--
    avatar_stylestring否''-
    avatar_seedstring否''-
    group_iduint否2-
    pointsuint否0-
    statuskey否'pending'-
    user_iduint否0-
    created_atuint否--
    reviewed_atuint否0-
    reviewer_iduint否0-

    plugin_user_review_topics

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否--
    forum_iduint否--
    titlestring否--
    bodytext否--
    statuskey否'pending'-
    content_typekey否'topic'-
    reply_topic_iduint否0-
    published_iduint否0-
    reject_reasontext否''-
    created_atuint否--
    reviewed_atuint否0-
    reviewer_iduint否0-

    plugin_user_review_email_codes

    字段类型可空默认值约束
    idid否-主键、自增
    emailstring否--
    code_hashstring否--
    ipstring否''-
    used_atuint否0-
    expires_atuint否--
    created_atuint否--

    plugin_user_review_password_resets

    字段类型可空默认值约束
    idid否-主键、自增
    user_iduint否--
    token_hashkey否-唯一
    expires_atuint否--
    used_atuint否0-
    created_atuint否--

    plugin_user_review_ip_logs

    字段类型可空默认值约束
    ipkey否-主键
    register_countuint否0-
    register_atuint否0-
    login_fail_countuint否0-
    login_fail_atuint否0-
    reset_fail_countuint否0-
    reset_fail_atuint否0-
    created_atuint否--
    updated_atuint否--

    plugin_user_review_stats

    字段类型可空默认值约束
    iduint否-主键
    registrationsuint否0-
    contentsuint否0-
    rejected_contentsuint否0-
    registration_latest_atuint否0-
    content_latest_atuint否0-
    updated_atuint否0-
    #1
  • bbs1org

    支持邮箱后缀限制,后台为单行输入框
    邮箱后缀不匹配时明确提示支持的后缀
    审核模式:
    关闭审核
    用户前 X 个主题/回帖审核
    用户注册需要审核
    主题审核数、回帖审核数分开配置和判断
    注册审核通过后才正式创建用户
    待审核内容进入后台审核队列
    首页侧边栏给管理员显示待审核卡片
    审核队列 UI 修正,参考签到卡片风格
    审核通过/拒绝改为 Ajax,成功后当前行自动消失
    审核结果通知用户,主题/回帖通知包含标题并链接到已发布内容

    #2
  • qq

    最有价值必须安装的插件

    #3
  • 111

    确实好用

    #4
  • 233

    @bbs1org 已按 topic/245 完成 1.3.0 整改:新增 content_kind 并兼容迁移旧 content_type,移除 MySQL 专用列修改,已验证旧数据迁移。平台不允许非原作者更新同 ID,修正版源码:

    user_review_1.3.0.php1

    #5
  • idc

    确实不错👍

    #6
  • bbs1org

    调整注册页的邮箱验证码会移动到邮箱输入框正下方

    #7
  • bbs1org

    已修复:AJAX 发布审核提示只在当前响应显示,不再写入 flash Cookie;浏览器返回页面不会重复弹出。

    #8
  • 123456789

    @bbs1org 虚拟发送已开启,邮件未实际发出。能否把这个文字去掉。当启用邮件验证码,但用虚拟发送的时候,提示给用户,用户可能迷惑啥意思。

    #9
  • 123456789

    @bbs1org 启用虚拟发送的时候,把您的验证码为:123456,把这行加粗加颜色。用户一眼就看清楚了。好点吧。

    #10
  • bbs1org

    这个细节可以改进

    #11
  • bbs1org

    优化虚拟发送邮件提示细节

    #12
  • 123456789

    急速啊🤣

    #13
  • x

    paste-20260812-165112.png

    在这个 用户审核 里面填写了正确的 smtp 信息,没办法实现发送验证码
    让ai做了个 smtp 探针测试,数据填写都是一样的,结果没问题,能收到邮件。是什么情况?
    paste-20260812-165426.png

    最后编辑于 2026-08-12 16:54
    #14
  • bbs1org

    那就让ai分析bbs1org的代码,为啥发不出去

    #15
  • x

    他让我找日志,.log 文件 我没找到,哈哈

    #16
  • bbs1org

    看来还是小白,你就说:我是老奶奶,我找不到.log 文件,你告诉我,全都直接告诉我。我笨😁

    最后编辑于 2026-08-12 16:57
    #17
  • x

    我直接把整个丢给他了,让他去找😄

    #18
  • x

    真是服了,傻到家了,让他查还真找到了,端口 465 我写错成456了

    #19
  • 350

    🔍 插件审查报告(对照《AI 开发规则》与开发者文档)

    🔒 安全问题

    1. 邮箱验证码可被爆破:user_review_check_email_code(plugin.php:648-656)只校验 6 位数字码,验证尝试无次数/频率限制(仅发送侧 624-629 按 IP 限频)。攻击者可反复提交穷举验证码,绕过注册或改邮箱的邮箱归属校验。建议对验证码校验加按 IP/邮箱的失败计数与锁定(如连续 5 次失败锁定一段时间)。

    ⚡ 性能问题

    未发现明显问题。

    🐛 功能/规范缺陷

    1. 无效 Hook:manifest 注册 attachment.before_upload(plugin.php:1613),但核心源码无此钩子触发点,导致「审核中/已拒绝内容禁止上传附件」功能永不生效。建议核对核心真实上传钩子名后修正或移除。
    2. 私有钩子缺前缀:forgot_password.before_submit/forgot_password.form_extra(plugin.php:396/420、1605-1606)为插件自定钩子,却无 user_review. 前缀。建议改为 user_review.forgot_password.* 并同步 fire 处。
    3. 后台写操作未 require_post():user_review_admin_page(plugin.php:1402)手动判断 REQUEST_METHOD,建议改用 require_post()。
    4. 跨库 upsert 手写:user_review_rate_hit(153-160)手写 MySQL ON DUPLICATE KEY+IF() 与 ON CONFLICT 分支,建议改用 app_db_upsert()/app_db_insert_ignore()。

    ✅ 修复优先级

    先修验证码爆破限制 → 修正无效/私有 Hook 命名 → 其余规范项统一。

    #20
  • bbs1org

    版本 1.6.15 更新:
    优化细节体验

    #21
  • bbs1org

    版本 1.6.18 更新:
    后台“安全限制”新增可配置项:

    • 注册用户名最短/最长长度,范围 1-20
    • 注册密码最短长度,范围 4-128

    默认规则为用户名 3-20 个字符、密码至少 6 位。注册提交时会在写入待审表前校验;OAuth 注册不要求本地密码。配置反向时会自动将最长长度收敛到不小于最短长度。
    队列统计改为增量维护,避免审核、拒绝、删除时反复全表 COUNT/MAX。
    新增拒绝队列和个人审核列表所需索引。
    后台与个人审核列表仅加载正文预览,点击单条后才读取全文。
    通配关键词改为线性片段匹配,避免长正文触发正则回溯。
    “已查看”状态仅在存在新待审内容时写入设置。

    #22
  • bbs1org

    版本 1.6.19 更新:
    “安全限制”中,注册、登录错误、密码找回错误各自可设置:

    • 限制时长,单位分钟,1-10080
    • 限制次数,1-100

    默认保持原行为:60 分钟,注册 1 次,登录/找回密码错误各 5 次

    #23
  • 123456789

    发布审核和发布审核模式啥意思,还有前几个发布是啥意思啊😅

    #24
  • bbs1org

    让ai按老奶奶方式优化了下措辞

    #26
  • 123456789

    😅

    #27
  • 123456789

    这把清楚了,你这个插件太高级了,不解释下真不知道啥意思🤓

    #28
  • bbs1org

    版本 1.6.21 更新:
    已修正文案,配置含义更直观:

    • “开启用户审核”改为“新用户注册需要审核”,并说明审核通过后才能登录发言。
    • “发布审核模式”改为“新用户发帖审核范围”。
    • “前几个发布”改为“审核次数设置(主题和回帖合计)”,并说明 N 的计算方式。
    • “发布审核”改为“审核时机”,明确区分“审核通过后公开”和“先公开,不通过时下架”。
    • Cloudflare 验证码的“前几个发帖”文案也同步明确。
    #25
  • 399

    🔁 复核回帖(AI 自动核对,对照 8/18 楼上 350 的审查报告与当前 v1.6.21 源码)

    结论:350 原报告共提出 4 项问题(含 1 项在本次核对中发现属误判,予以更正),逐条核对如下:

    1. 邮箱验证码可被爆破:user_review_check_email_code()(plugin.php:730-737)仍只做格式校验(6 位数字)+ password_verify() 比对,未见按 IP/邮箱的验证失败计数或锁定逻辑。发送侧仍只限制发送频率(同 IP 间隔分钟数可配),验证提交侧无限次尝试限制依旧存在。
    1. 更正说明:8/18 报告称 attachment.before_upload(plugin.php:1782)为"无效 Hook",经本次核对该结论有误——该 Hook 由另一插件 attachment_upload(附件上传)在其上传流程中定义并调用(非核心 index.php 直接提供),只要两个插件同时启用,user_review_attachment_before_upload() 确实会被触发,功能有效。特此更正,避免误导。
    1. 私有 Hook 缺插件前缀:forgot_password.before_submit、forgot_password.form_extra(plugin.php:426/450,manifest 1774-1775 行)仍未加 user_review. 前缀。
    1. 后台写操作手动判断请求方式: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)仍手写 MySQL ON DUPLICATE KEY+IF() 与 SQLite/PG ON CONFLICT 分支,未改用 app_db_upsert()。

    补充核对:v1.6.18/1.6.19 新增的限流参数可配置化(各 bucket 独立的时长/次数)读取时均有 max(1,min(...)) 上下限夹取,未见新引入的边界问题。

    第 1、3、4、5 项问题延续自 8/18 报告、仍未修复;第 2 项经核对为原报告误判,已更正。本次核对未发现新增问题;建议优先处理第 1 项(验证码爆破,属安全类),其余为规范/功能类,按原优先级修复即可。

    #29
  • idc

    自动停用原因
    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)

    #30
  • bbs1org

    更新一下

    #32
  • idc

    这个效率也太高了。

    #33
  • bbs1org

    版本 1.6.22 更新:
    已修复 PostgreSQL 的 UPSERT 字段歧义。
    login_fail_at 现明确引用为 plugin_user_review_ip_logs.login_fail_at,避免与 excluded 记录冲突

    #31
  • bbs1org

    版本 1.6.23 更新:
    用户名命中“待审关键词”会强制进入注册待审队列。
    用户名命中“拒绝关键词”会直接拒绝注册。
    拒绝关键词优先于待审关键词。
    后台两项关键词的说明已明确包含新注册用户名。
    OAuth 用户命中待审关键词时给出明确提示,避免进入本地密码流程。

    #34
  • bbs1org

    版本 1.6.23 更新:
    添加预览

    #35
  • bbs1org

    版本 1.6.24 更新:
    优化体验

    #36
  • bbs1org

    版本 1.6.26 更新:
    修复 OAuth 冲突问题

    #37
  • bbs1org

    版本 1.6.27 更新:
    采用个人设置新hook

    #38
  • bbs1org

    版本 1.6.30 更新:
    优化人机验证体验

    #39
  • code

    这CAP人机验证咋填写的啊!
    paste-20260914-215308.png

    #40
  • bbs1org

    需要你自己部署cap,部署完后,会有相关参数,实在不会就让ai帮你弄吧

    #41
  • 583455189

    CloudflareTurnstile和Cap那个好用一点

    #42
  • bbs1org

    CloudflareTurnstile 厉害。但是慢

    #43
  • bbs1org

    版本 1.6.30 更新:
    支持v10

    #44
  • bbs1org

    版本 1.6.31 更新:
    更新版本号

    #45

发表回复

登录后回复