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
插件版本碎片化