Xiuno BBS 审计之问题:插件 conf.json 版本碎片化
此文章为XIUNOX版本重构审计时发现问题,XIUNOX版本已优化修复此问题。分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。
现象
Xiuno BBS 4.0.4 的插件元数据完全依赖 plugin/
/conf.json,存在严重的版本管理碎片化问题:version、bbs_version、dependencies 字段全部为插件作者自填字符串,无 schema 校验、无中央仓库对齐。bbs_version 默认值 '4.0',插件作者不填则视为兼容 4.0 全系列,但 4.0.0 与 4.0.4 内部 API 已多次变更。dependencies 字段虽声明依赖插件名及版本,但 plugin_dependencies() 函数只检查"是否安装且启用",完全不校验版本号。没有中央插件仓库(plugin.xiuno.com 已失效),所有版本信息无法对齐,老插件版本号与新版 BBS 不匹配也无法告警。plugin_official_list_cache() 调用失效的 plugin.xiuno.com/plugin-all-4.htm,缓存为空时静默返回错误。源码证据文件:xiunobbs_4.0.4/model/plugin.func.php 第 111-124 行(依赖检查不校验版本)function plugin_dependencies($dir) { global $plugin_srcfiles, $plugin_paths, $plugins; $plugin = $plugins[$dir]; $dependencies = $plugin['dependencies']; // 检查插件依赖关系 $arr = array(); foreach($dependencies as $_dir=>$version) { // $version 被读取 if(!isset($plugins[$_dir]) || !$plugins[$_dir]['enable']) { $arr[$_dir] = $version; // 仅检查 enable,不调用 version_compare } } return $arr; } 文件:xiunobbs_4.0.4/model/plugin.func.php 第 457-458 行(bbs_version 默认值过于宽松)!isset($local['version']) && $local['version'] = '1.0'; !isset($local['bbs_version']) && $local['bbs_version'] = '4.0'; 文件:xiunobbs_4.0.4/model/plugin.func.php 第 418-433 行(中央仓库缓存逻辑,依赖失效的官方源)function plugin_official_list_cache() { $s = DEBUG == 3 ? NULL : cache_get('plugin_official_list'); if($s === NULL) { $url = PLUGIN_OFFICIAL_URL."plugin-all-4.htm"; // 获取所有的插件,匹配到3.0以上的。 $s = http_get($url); // 检查返回值是否正确 if(empty($s)) return xn_error(-1, '从官方获取插件数据失败。'); $r = xn_json_decode($s); if(empty($r)) return xn_error(-1, '从官方获取插件数据格式不对。'); $s = $r; cache_set('plugin_official_list', $s, 3600); // 缓存时间 1 小时。 } return $s; } 文件:xiunobbs_4.0.4/admin/route/plugin.php 第 142-145 行(下载时仅检查 BBS 版本,不检查依赖插件版本)// 检查版本 / check version match if(version_compare($conf['version'], $official['bbs_version']) == -1) { message(-1, lang('plugin_versio_not_match', array('bbs_version'=>$official['bbs_version'], 'version'=>$conf['version']))); } 文件:xiunobbs_4.0.4/model/plugin.func.php 第 506 行(have_upgrade 仅比较官方版本号,但官方源失效后永远为 FALSE)$plugin['have_upgrade'] = $plugin['installed'] && version_compare($official['version'], $local['version']) > 0 ? TRUE : FALSE; 风险等级与结论风险等级:高(High)|生态缺陷危害:plugin_dependencies() 仅检查依赖插件是否启用,完全忽略版本号,A 插件依赖 B 插件 >=2.0,但用户安装的是 B 1.0 也能通过检查,运行时崩溃。无中央仓库意味着插件版本、兼容性、安全更新全部失联,用户无法判断本地插件是否过时。bbs_version 默认 '4.0',4.0.4 上的 API 变更不会被检测,安装即破坏。have_upgrade 永远为 FALSE,用户根本看不到升级提示,安全补丁无法触达。第三方分发的插件无签名校验,与官方源失效叠加,形成"野生市场"乱象。修复建议:在 plugin_dependencies() 中加入 version_compare($plugins[$_dir]['version'], $version, '>=') 强制版本校验,不满足则返回错误。conf.json schema 强制声明 php_version、bbs_version_min、bbs_version_max,安装时严格校验。替换失效的 plugin.xiuno.com 为社区维护的镜像源(如 https://plugins.xiuno.org/),并加入 HTTPS 与签名校验。引入插件签名(Ed25519 公钥),官方源(或镜像)下发插件包附 .sig 文件,安装前校验。提供 plugin_outdated 字段,比对中央仓库最新版本,UI 显著提示用户升级。