插件质量报告
插件:
ip_historyHook 功能范围 循环 使用频率 文件读写 修改系统表 读写系统表 读写自己的表 reply.after_render 主题查看页/回帖列表逐条渲染 是 5 - - - - sidebar.stack 全站侧栏组件栈 否 5 - - - 读 plugin_ip_history_users topic.after_render 首页/版块列表/主题查看逐条渲染 是(列表跳过) 5 - - - - topic.after_view 主题查看页完成加载 否 4 - - - 读 plugin_ip_history_addresses user.can_speak 发帖权限检查 否 4 - - - 读 plugin_ip_history_mutes reply.after_save 回帖保存后 否 3 - - - 写 plugin_ip_history_users, plugin_ip_history_addresses topic.after_save 主题保存后 否 3 - - - 写 plugin_ip_history_users, plugin_ip_history_addresses 颜色说明:黄色表示有数据读写,红色表示 Hook 在系统循环中执行,浅蓝色表示有文件写入。“列表跳过”表示回调在列表路径会提前返回,“回调内”表示操作位于回调自身或其帮助函数的循环体内。“文件批处理”表示逐个处理用户一次提交的文件,属于必要操作,不标记修正。只有操作实际处于需要优化的循环路径时,才会标记“修正❗️”。
数据字典
plugin_ip_history_users字段 类型 可空 默认值 约束 user_id uint 否 - 主键 ip key 否 - 主键 first_seen_at uint 否 - - last_seen_at uint 否 - - topic_count uint 否 0 - reply_count uint 否 0 - plugin_ip_history_addresses字段 类型 可空 默认值 约束 ip key 否 - 主键 ip_address string 否 '' - updated_at uint 否 - - plugin_ip_history_mutes字段 类型 可空 默认值 约束 id id 否 - 主键、自增 pattern key 否 - 唯一 note string 否 - - enabled INTEGER 否 1 - created_by uint 否 - - created_at uint 否 - - updated_at uint 否 - - 聚合记录用户发帖、回帖 IP,支持通配 IP 搜索马甲和按 IP 禁言。
马甲无处逃
恐怖
我是马甲,来抓我
@bbs1org 已按 topic/245 完成 1.4.0 安全整改:校验目标域名全部 A/AAAA 地址,拒绝私网和保留地址,并通过
CURLOPT_RESOLVE固定已验证解析结果。平台不允许非原作者更新同 ID,修正版源码:🔍 插件审查报告(对照《AI 开发规则》与开发者文档)
🔒 安全问题
- IP 禁言可被请求头伪造绕过。
plugin.php:51读取HTTP_CLIENT_IP / HTTP_CF_CONNECTING_IP / HTTP_X_FORWARDED_FOR等客户端可任意伪造的头,plugin.php:166的ip_history_can_speak()据此判定是否禁言。被禁言用户每次换一个X-Client-IP/X-Forwarded-For即可绕过。建议禁言判定改用REMOTE_ADDR,或仅在确认站点代理来源后信任单一可信头。
⚡ 性能问题
未发现明显问题。
🐛 功能/规范缺陷
plugin.php:94-99手写 MySQL/SQLite/PostgreSQL 三套分叉的 upsert 裸 SQL,绕过app_db_upsert();MySQL 分支VALUES()在 8.0.20+ 已弃用,建议封装并改用新别名语法。plugin.php:48-60的ip_history_client_ip()与核心ip_addr()逻辑重复,建议直接复用核心函数。plugin.php:257/260/636CSS 写死font-size:11px/12px,违反“字号必须使用 var(--font-size-*)”,建议改用语义变量。
✅ 修复优先级
- 修复 IP 禁言绕过(安全);2. 复用核心
ip_addr();3. 规范化 upsert 与 CSS 字号。
- IP 禁言可被请求头伪造绕过。
版本 1.4.1 更新:
优化UI细节