Why
Xiuno BBS 4.0.4 早已停止维护,遗留大量安全漏洞、PHP8 适配兼容问题、底层架构短板,同时生态长期碎片化。
目前社区缺少一套基于原版完整源码、一事一文档的结构化缺陷佐证资料。
此前我在 xiunobbs.cn 发布过二十余篇重构解析文章,但不少读者看完依旧无法清晰区分 Xiuno X 相较于原版做了哪些升级优化。
本文档规范计划对 xiunobbs_4.0.4/ 原版源码开展完整深度审计,每一处问题单独生成独立 Markdown 文件。
一方面为后续开发者重构方案提供可溯源、可核对的事实依据;
另一方面可供不愿迁移至 Xiuno X 的开发者,自行对照审计文档针对性修复改造;
同时也能直观对照出 Xiuno X 已完成的全部修复与升级内容。
What Changes
-
新建审计输出目录 ./audit_404/,按四类前缀分类存放缺陷文档
-
每一条经源码核实的缺陷独立生成一个 md 文件(一问题=一文件,严禁合并)
-
每个文档采用固定四段结构:# 标题 → ## 现象 → ## 源码证据(带真实文件路径与行号 + 代码片段)→ ## 风险等级与结论(含危害说明 + 修复建议)
-
全部文档生成后创建 audit_404/index.md 汇总目录索引
-
创建 Trae Work 专用 Skill:.trae/skills/xiuno_audit_split/SKILL.md
-
创建配套输出规则:.trae/rules/output_rule.yaml(强制一事一文)
-
生成可一键打包的压缩包 xiuno404_defect_docs.zip
Impact
ADDED Requirements
Requirement: 一事一文输出约束
审计文档 SHALL 严格遵守"一个独立问题 = 一个 md 文件"。禁止把多条缺陷写入同一文档;禁止在一个文档中附带与主题无关的其他缺陷。
Scenario: 单文件内容边界
Requirement: 文档固定四段结构
每个缺陷文档 SHALL 包含且仅包含四个一级/二级标题段落:
-
# 问题:<标题> —— 一级标题,简明陈述问题
-
## 现象 —— 描述缺陷表现与触发条件
-
## 源码证据 —— 引用真实源码,必须包含文件相对路径 + 行号 + 代码块
-
## 风险等级与结论 —— 标注风险等级(高危/中危/低危/兼容障碍/架构缺陷/生态缺陷),说明危害后果,给出修复建议
Scenario: 源码证据可追溯
Requirement: 按真实源码审计
文档内容 SHALL 以 xiunobbs_4.0.4/ 实际源码为准,不得照抄需求清单中与源码不符的描述。若需求清单条目与源码实际不符,应基于真实源码重新表述缺陷论点,或在证据中说明"清单描述失实,实际缺陷为……"。
Scenario: 清单失实条目处理
Requirement: 尽可能挖掘全部问题
审计 SHALL 不局限于需求清单列出的 24 条候选条目,对源码进行全面扫描,凡在真实源码中可定位证据的安全/兼容/架构/生态缺陷均应生成独立文档。需求清单作为候选引导,不作为上限。
Scenario: 发现清单外缺陷
Requirement: 文件命名与分类
文档 SHALL 输出到 ./audit_404/,按四类前缀命名:
-
01_critical_xxx.md —— 高危安全类(SQL 注入、XSS、CSRF、上传、密码、会话、安装目录等)
-
02_compat_xxx.md —— PHP8 兼容障碍类(废弃函数、移除特性、字符集、严格模式报错等)
-
03_struct_xxx.md —— 底层架构缺陷类(MVC、插件沙盒、全局变量、缓存、接口层等)
-
04_plugin_xxx.md —— 插件与主题生态缺陷类(编码规范、钩子冲突、主题硬编码、版本碎片化等)
Scenario: 文件归类
Requirement: 目录索引
全部缺陷文档生成后 SHALL 创建 audit_404/index.md,按四类分组列出所有文档的相对链接,并在每组前注明类别说明。
Scenario: 索引可用
Requirement: Skill 与规则文件
SHALL 创建 .trae/skills/xiuno_audit_split/SKILL.md(Skill 定义,含 name/description/allowed-tools/globs/执行规则)与 .trae/rules/output_rule.yaml(强制一事一文的输出规则),内容以本 spec 与用户原始需求为蓝本。
Scenario: Skill 可调用
Requirement: 打包发布
全部文档生成后 SHALL 执行 zip -r xiuno404_defect_docs.zip ./audit_404/ 生成可发布到 Gitee 的压缩包。
Scenario: 打包完成
审计条目范围(候选清单,按真实源码核实后生成)
01 高危安全类(候选 8 条 + 挖掘新增)
-
db 抽象层用 addslashes 转义而非 PDO 预处理,存在 SQL 注入风险(含宽字节)
-
用户密码存储方式(MD5+盐 vs 现代哈希,需核实 route/user.php 与 model/user.func.php)
-
GET/POST 变量直接拼接进 SQL(核实 db_cond_to_sqladd 与各 route 文件)
-
存储型 XSS,模板输出未统一 htmlspecialchars
-
文件上传校验机制(后缀黑名单 vs 白名单 vs MIME)
-
后台操作 CSRF 令牌防护情况
-
install 安装目录未自动清理,可重置数据库
-
Cookie 未设置 HttpOnly/Secure/SameSite
02 PHP8 兼容障碍类(候选 5 条 + 挖掘新增)
-
mysql_* 系列函数在 PHP8 移除(核实 db_mysql.class.php 与 install/index.php)
-
create_function() / each() 在 PHP8 移除
-
正则 /e 修饰符废弃
-
仅 utf8 字符集,不支持 utf8mb4
-
严格模式下未定义变量、数组越界
03 底层架构缺陷类(候选 6 条 + 挖掘新增)
-
纯面向过程,无 MVC 分层
-
插件钩子点不足
-
无插件运行沙盒(plugin_compile_srcfile 直接合并编译)
-
全局变量泛滥
-
缓存类型支持情况(核实 conf.default.php 已支持 redis/memcached,需重新表述为"默认配置仅 mysql 缓存,未默认启用 Redis"或剔除该条)
-
无统一接口层,AJAX 散乱
04 插件与主题生态缺陷类(候选 5 条 + 挖掘新增)
-
插件无统一编码规范,可篡改全局函数(overwrite 机制)
-
不同插件共用钩子冲突
-
老主题硬编码数据库查询
-
插件仅适配 PHP7
-
插件版本碎片化