[vip_apply]申请VIP热
61911
- 申请VIPID vip_apply版本 1.0.1插件制作者 bbs1org免费417 行 / 26.3 KBHook / 路由 / 后台页用户回答问题申请VIP,管理员审核通过后自动更换用户组并发放积分奖励,双方均收到站内通知。app/plugins/vip_apply/plugin.php开发日志已有 2 条
个人独立维护项目。
主楼 插件质量报告
插件:
vip_applyHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 sidebar.feature_links 首页/侧栏快捷功能 否 5 - - - 读 plugin_vip_apply_applies 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_vip_apply_applies字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - - answers text 否 - - status INTEGER 否 0 - remark string 否 '' - handled_by uint 否 0 - handled_at uint 否 0 - created_at uint 否 - - 版本 1.0.0 更新:
新增通知接收人设置与待审核数字提醒;管理者前台入口直达管理后台,申请列表置顶;优化查询性能与并发提交校验,修复封禁账号可提交申请等问题。🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件为新发布插件,独立首次审查)
插件:申请VIP(vip_apply)v1.0.0
🔒 安全问题
未发现越权或注入类问题。写操作路由均有 need_login()/need_admin()(依赖核心路由层)+ require_post() + CSRF 校验;所有输出经 h() 转义;SQL 均参数化。⚡ 性能问题
未发现明显问题。列表页用户信息通过 rows_by_ids() 批量读取,未见循环查询。🐛 功能/规范缺陷
- 审批操作存在并发重复处理风险:vip_apply_handle()(plugin.php 约293-310行)在事务外先读取申请状态(row('plugin_vip_apply_applies', 'id', $apply_id))并判断 status!==0 拦截重复处理,但随后事务内的 UPDATE 语句(
SET status=1... WHERE id=?)未附加AND status=0条件,且发放积分的 user_points_change() 调用在事务之外、同样没有重新校验状态。若同一条待审申请被连续点击两次"通过"(或两名有权限的管理员同时处理同一条),两次请求都可能在状态判断阶段读到 status=0 而先后通过检查,导致积分被重复发放、站内通知被重复发送。更新日志称"优化并发提交校验",但核实后该防护只覆盖了申请人提交侧(vip_apply_submit 在事务内重新查询最新状态),审批侧未见同等保护。建议将审批更新改为UPDATE ... SET status=1 WHERE id=? AND status=0,并依据受影响行数判断是否已被他人处理,同时把加分与通知也纳入这层判断之后再执行。
- 管理入口与实际权限判定不一致:vip_apply_is_manager()(plugin.php 约118-121行)用 can_access_admin() || can_manage() 判定"是否管理者",只要满足其一即会在侧栏展示"VIP申请管理"入口,并在访问 /vip_apply 时直接跳转到后台设置页(admin_url(['tab'=>'vip_apply']))。但该后台页挂载在 admin_tabs,实际访问权限由核心 admin_page() 统一用 need_admin()(即 can_access_admin())把关。因此只被授予"允许用户和内容管理"(allow_manage=1)但未授予"允许后台管理"(allow_admin=0)的用户组成员,会先看到管理入口、被强制跳转,随后在后台页遭遇"无权限"报错,形成死胡同体验。建议统一判定口径,例如仅用 can_access_admin() 作为"管理者"标准,或者管理端也允许 can_manage() 用户实际访问。
✅ 修复优先级
优先处理第 1 项(审批并发重复发放积分,涉及资金/积分安全);第 2 项为体验一致性问题,建议一并修正。- 审批操作存在并发重复处理风险:vip_apply_handle()(plugin.php 约293-310行)在事务外先读取申请状态(row('plugin_vip_apply_applies', 'id', $apply_id))并判断 status!==0 拦截重复处理,但随后事务内的 UPDATE 语句(
版本 1.0.0 更新:
添加预览你怎么又变成admin了?
挺好玩
版本 1.0.1 更新:
修正通知格式或者积分变动不进积分规则的问题
