- Premium 与 富可敌国 会员ID neo_premium版本 2.5.0插件制作者 mingmeo免费1334 行 / 59.1 KBHook / 路由 / 后台页限制普通用户发帖、回帖长度以及每日发帖/回帖数,Premium 不受限,同时有富可敌国高级会员体系。app/plugins/neo_premium/plugin.php开发日志最新 10 条
此项目接受所有登录用户协助维护和提交更新。
主楼 插件质量报告
插件:
neo_premiumHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 page.footer 全站页面页脚 否 5 - - app_users 读 plugin_neo_premium_users, plugin_neo_premium_super_users sidebar.feature_links 首页/侧栏快捷功能 否 5 - - - 读 plugin_neo_premium_config user.menu_links 个人卡片/移动端我的菜单(展示位置:个人卡片) 否 4 - - - 读 plugin_neo_premium_config reply.before_save 回帖发布/编辑表单提交 否 3 - - app_replies 读 plugin_neo_premium_users, plugin_neo_premium_config topic.before_save 主题发布/编辑表单提交 否 3 - - app_topics 读 plugin_neo_premium_users, plugin_neo_premium_config 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_neo_premium_users字段 类型 可空 默认值 约束 user_id uint 否 - 唯一 expire_at uint 否 0 - granted_by uint 否 - - granted_at uint 否 - - plugin_neo_premium_super_users字段 类型 可空 默认值 约束 user_id uint 否 - 唯一 expire_at uint 否 0 - granted_by uint 否 - - granted_at uint 否 - - plugin_neo_premium_config字段 类型 可空 默认值 约束 config_key key 否 - 唯一 config_value string 否 - - plugin_neo_premium_products字段 类型 可空 默认值 约束 id id 否 - 主键、自增 name VARCHAR(80) 否 - - description TEXT 否 - - product_type VARCHAR(20) 否 'premium' - price_points uint 否 - - duration_days uint 否 0 - is_enabled uint 否 1 - created_at uint 否 - - plugin_neo_premium_purchases字段 类型 可空 默认值 约束 id id 否 - 主键、自增 user_id uint 否 - - product_id uint 否 - - expire_at uint 否 0 - purchased_at uint 否 - - 版本 1.0.0 更新:
NEO_PREMIUM Premium 会员
简介
增加 Premium 会员,管理员可设置非 Premium 会员回复字数限制等等诸多限制项。
支持功能
- 限制普通用户
- 管理员授予/撤销用户 Premium 资格
- 支持开放积分兑换会员
- 管理积分兑换商品
- bbs1org2026-08-16
- bbs1org2026-08-16
我开一下试试
- bbs1org2026-08-16
而且用户怎么全都有了?
- bbs1org2026-08-16
右侧缺少icon

- bbs1org2026-08-16
会员商场有点搞不清,不如就叫富可敌国
🔍 插件审查报告(对照《AI 开发规则》与开发者文档)
🔒 安全问题
高危:plugin.php:371 在页面开头读
$points,421 用旧值判「积分不足」,443-473 先授予会员再user_points_change()扣分,两者不在同一事务且user_points_change自带事务、不拦负余额。并发请求可重复通过余额校验,导致负积分或免费开通会员。建议整体包进一个 tx(),事务内重取实时余额并用points >= price条件 UPDATE 扣减(受影响 0 行则报积分不足),且 tx 内不要调用 user_points_change()。
低:plugin.php:510-524check_users的usernames[]无数量上限,可放大 IN 查询并回传任意用户会员态,建议限数量并做结果缓存。⚡ 性能问题
低:plugin.php:221-337 每个登录用户每页都注入脚本并 POST 一次 check_users,再对全页用户名做一次查询,建议请求级缓存或按需请求。
🐛 功能/规范缺陷
中:daily_topic_limit/daily_reply_limit 有配置、有后台、描述也写了,但 before_save 只校验长度,每日限额从未实现,建议补实现或移除该配置。
中:plugin.php:189、205 依赖$ctx['editing']/$ctx['user_id'],但核心 topic/reply.before_save 只传 id/action,导致「编辑豁免」永远不生效、编辑也会被长度限制。
中:plugin.php:51-54 直接 ALTER TABLE 加列,应用app_db_ensure_columns。
低:CSS 大量写死字号与色值,建议改 --font-size-* 与系统状态色变量。✅ 修复优先级
- 高危:兑换流程事务化并原子扣积分。
- 中:补/删每日限额;修正 before_save 的 ctx 判断;ALTER 改 ensure_columns。
- 低:限流并缓存 check_users、CSS 变量化。
🔍 复核报告(v2.2.2,回应此前审查)· @banming
✅ 已确认修复
- 高危积分竞态:兑换已整体包进 tx()(plugin.php:503),事务内 UPDATE app_users SET points=points-? WHERE id=? AND points>=?(plugin.php:522)并以 rowCount()===0 报积分不足(plugin.php:523)——原子扣减、不产生负余额,且不再在事务内调 user_points_change()。
- check_users 数量上限:已截断到 100(plugin.php:601-603)。
- 每日限额已实现:daily_topic_limit/daily_reply_limit 在 before_save 内计数拦截(plugin.php:229-235、255-261)。
- 直接 ALTER TABLE 已改 app_db_ensure_columns()(plugin.php:49-51)。
❌ 未生效 / 新问题
「编辑豁免」仍失效(关键):$is_edit 写成 ($ctx['action'] ?? '') === 'edit' || (!empty($topic['id']) && ...)(plugin.php:216),回帖同款(plugin.php:242)。但核心 topic.before_save 只传 ['id'=>...,'action'=>...],action 取值是 delete/pin/unpin/highlight/mute_author、从无 'edit';而 $topic/$reply 是值数组(['title','body','forum_id'] / ['body','topic_id']),根本没有 'id' 键。两条件恒假 → 编辑仍被长度/每日限额限制。一行修复:$is_edit = (int)($ctx['id'] ?? 0) > 0;。
💡 顺带建议
徽章渐变写成空值 linear-gradient(90deg, , , , , ) 且 -webkit-text-fill-color:transparent(plugin.php:930、941),徽章文字会透明不可见;另有 color: ; 空值(plugin.php:1043、1047、1055、1073)。check_users 的 array_filter 未 array_values(plugin.php:600),攻击者发 usernames[x]= 字符串键会触发 PDO 绑定异常(500),建议补 array_values()。
积分安全已修好,但编辑豁免还需改一行。
🔍 复核报告(v2.2.3,回应 2.2.2 版审查)· @banming
✅ 已确认修复
- 编辑豁免:plugin.php:216、242 $is_edit=(int)($ctx['id']??0)>0,与核心 topic.before_save(index.php:2438 ctx 仅传 id/action)、reply.before_save(index.php:2524)对齐,编辑不再被长度/每日限额拦截。
- 积分竞态:503-571 整体包进 tx();522 行 UPDATE app_users SET points=points-? WHERE id=? AND points>=?,523 行 rowCount()===0 判余额不足,原子扣减无负余额。
- check_users 数量上限:602-604 截断到 100。
- 每日限额:229-235、255-261 已实现计数拦截。
- 直接 ALTER 改 app_db_ensure_columns():49-51。
- 徽章空渐变已补真实色值(931、942);color: 空值已补 #fff(1044/1048/1056/1074)。
- check_users 补 array_values():601。
❌ 未生效 / 新问题
- 【规范】page.footer 直接拼接整段内联 <script>(285-415),违反「固定 JS 只能经 manifest assets、动态值走 data-*」;且声明全局 window.neoCurrentUser(288)未用 neo_premium_ 前缀,另用 JS 动态注入 <style> 重复定义 @keyframes(295)。neo_premium_js()(1194-1201)实为空壳 IIFE。
- 【XSS-低危】275 行 json_encode(['username'=>me()['username']], JSON_UNESCAPED_UNICODE) 直接嵌入 <script>,未转义 </>;核心注册对用户名只限长不筛字符(index.php:2322),用户名含 </script> 会破坏脚本(本人会话自 XSS)。建议补 JSON_HEX_TAG|JSON_HEX_AMP。
- 【规范】依赖核心 DOM 类名 .post-author/.user-name/.notice-profile-name/.mobile-menu-link/.nav-mine/.user-card(319、327、373、381、391、399),违反「选择器限于插件根容器」,核心改类名即失效。
- 【功能】兑换扣积分用原始 UPDATE(522),绕过核心 user_points_change()(index.php:948),不触发 user.points_changed 事件(index.php:968),积分流水/风控类插件看不到这笔扣减(上轮为避嵌套事务的取舍,提示知悉)。
- 【规范】CSS 类名大量用 neo-(956、1033、1050、1098、1131、1153…),插件 ID 为 neo_premium,规范要求连字符形式 neo-premium-。
- 【轻微】管理端授予 days 无下限(661、684),负值经 144 行 $days>0 判假→写入永久。
💡 顺带建议
page.footer 每次对登录用户 2 次 DB 读(116-129、156-169,request 级缓存);feature_links/menu_links 各触发一次 config 全表读(94-107,共享缓存),量可接受。537-541 grant_user 与 app_db_upsert 双写冗余。
总结:上一轮 8 项全部修复,无高危;剩余为规范类(内联脚本/全局变量/CSS 前缀/核心选择器)与一处自 XSS、积分流水旁路,建议下版统一 assets 化并加 JSON_HEX_TAG。
- bbs1org2026-08-18
插件的管理页面没有对移动端进行适配优化
- bbs1org2026-08-19
富可敌国 会员已开通
您已成功兑换 富可敌国 会员,有效期至:永久。感谢您的支持!用户徽标不会渲染 🔍 插件审查报告(AI 自动审查,对照《AI 开发规则》与开发者文档;本插件未被 8/18 楼上 350 的报告覆盖,属独立首次审查)
插件:Premium 与 富可敌国 会员(neo_premium)v2.5.0
结论:已完成命名规范、生命周期(install/uninstall 幂等)、数据库跨库兼容、红区 Hook 零 DB 读、Hook 真实性(含核心与跨插件依赖核对)、SQL 注入风险、CSRF/权限校验、CSS 变量规范等项审查,未发现安全、性能或功能性问题。






