此文章为XIUNOX版本重构审计时发现问题,XIUNOX版本已优化修复此问题。分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。
现象
Xiuno BBS 4.0.4 的插件元数据完全依赖 plugin/<dir>/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) {
if(!isset($plugins[$_dir]) || !$plugins[$_dir]['enable']) {
$arr[$_dir] = $version;
}
}
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";
$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);
}
return $s;
}
文件:xiunobbs_4.0.4/admin/route/plugin.php 第 142-145 行(下载时仅检查 BBS 版本,不检查依赖插件版本)
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 显著提示用户升级。