Xiuno BBS 审计之问题1:mysql_* 扩展移除,PHP8 致命错误

简介: Xiuno BBS 4.0.4 因大量使用已废弃的 `mysql_*` 函数,在 PHP 7.0+(尤其是 PHP 8)下触发致命错误,导致数据库连接、安装等功能完全失效。本文详析问题根源、源码证据及修复方案,供开发者升级或维护参考。(239字)

Xiuno BBS 审计之问题1:mysql_* 扩展移除,PHP8 致命错误此文章为XIUNOX版本重构审计时发现问题,XIUNOX版本已优化修复此问题。分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。

现象

Xiuno BBS 4.0.4 的 db_mysql 数据库驱动类以及安装向导大量调用 mysql_connect / mysql_query / mysql_fetch_assoc / mysql_select_db / mysql_error / mysql_errno / mysql_insert_id / mysql_affected_rows / mysql_closeext/mysql 系列函数。该扩展在 PHP 5.5 被废弃,PHP 7.0 起整体移除,在 PHP 8 上调用会直接抛出 Fatal error: Uncaught Error: Call to undefined function mysql_connect(),导致数据库连接、查询、安装全部不可用。

源码证据

文件 xiunobbs_4.0.4/xiunophp/db_mysql.class.php(核心 mysql 驱动,共 13 处真实调用):

// 第 53-55 行:连接与选库
$link = @mysql_connect($host, $user, $password); // 如果用户名相同,则返回同一个连接。 fastcgi 持久连接更省资源
if(!$link) { $this->error(mysql_errno(), '连接数据库服务器失败:'.mysql_error()); return FALSE; }
if(!mysql_select_db($name, $link)) { $this->error(mysql_errno(), '选择数据库失败:'.mysql_error()); return FALSE; }
// 第 64, 77 行:结果集获取
$r = mysql_fetch_assoc($query);
while($arr = mysql_fetch_assoc($query)) {
// 第 106, 131 行:执行 SQL
$query = mysql_query($sql, $link);
$query = mysql_query($sql, $this->wlink);
// 第 138, 140 行:获取 INSERT/UPDATE 影响
return mysql_insert_id($this->wlink);
return mysql_affected_rows($this->wlink);
// 第 175, 177 行:关闭连接
$r = mysql_close($this->wlink);
$r = mysql_close($this->rlink);
// 第 188-189 行:错误信息
$this->errno = $errno ? $errno : ($this->link ? mysql_errno($this->link) : mysql_errno());
$this->errstr = $errstr ? $errstr : ($this->link ? mysql_error($this->link) : mysql_error());

文件 xiunobbs_4.0.4/xiunophp/xiunophp.min.php(第 39 行整行压制的 db_mysql 类,逻辑与上面一致,包含相同的 13 处 mysql_* 调用,作为生产模式默认加载文件)。

文件 xiunobbs_4.0.4/install/index.php

// 第 81 行:安装向导用 function_exists 探测 mysql_connect,PHP 8 下永远返回 FALSE,导致安装界面提示“不支持 mysql”
$mysql_support = function_exists('mysql_connect');
// 第 135 行:当 $type == 'mysql' 时直接调用 mysql_query 建库,PHP 8 下 Fatal error
if($type == 'mysql') {
    mysql_query("CREATE DATABASE $name");
    $r = db_connect($db);
}

文件 xiunobbs_4.0.4/xiunophp/db.func.php 第 71-74 行:注释中提及 mysql_insert_id/mysql_affected_rows/mysql_exec,虽非真实调用,但说明设计期仍假定 mysql 驱动存在。

统计:真实 mysql_* 函数调用 —— db_mysql.class.php 13 处、xiunophp.min.php 13 处(同逻辑压缩)、install/index.php 2 处(function_exists('mysql_connect') 探测 1 处 + mysql_query 1 处)。

风险等级与结论

兼容障碍(致命)ext/mysql 在 PHP 7.0 已被整体移除,PHP 8 中调用任意 mysql_* 函数均触发 Fatal error: Call to undefined function

危害:

  1. conf['db']['type'] == 'mysql' 时(conf.default.php 默认值即 'mysql'),站点启动即崩溃,无法连接数据库。
  2. 安装向导第 81 行 function_exists('mysql_connect') 永远返回 FALSE,若用户未启用 PDO,会被错误提示“环境不支持”而无法继续;若选 type=mysql,第 135 行建库直接 Fatal error。
  3. xiunophp.min.phpDEBUG <= 1 时的默认加载文件,影响所有生产环境。

修复建议:

  1. 强制将默认 db.type 改为 pdo_mysql,从 conf.default.phpconf/conf.php、安装向导中移除 mysql 类型选项;或在 db_new() 中拒绝 'mysql' 类型并回退到 pdo_mysql
  2. 删除 xiunophp/db_mysql.class.phpxiunophp.min.php 中的 class db_mysql,统一使用 db_pdo_mysql
  3. install/index.php 第 81 行改为只检测 pdo_mysql,第 134-136 行的 mysql_query("CREATE DATABASE $name") 改为通过 PDO 执行 CREATE DATABASE
  4. 若必须保留 db_mysql 类以兼容老配置,应在 db_mysql.class.php 顶部 if(!function_exists('mysql_connect')) return; 并在 db_new() 中提示用户切换驱动。
目录
相关文章
|
20天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes (K8s) 从入门到实战:命名空间、Pod、Controller、Service,图文并茂
本文是K8s初学者的实战笔记,系统讲解命名空间(隔离资源、环境划分、权限控制)、Pod(最小调度单元、多容器、标签、生命周期、探针、资源限制)、控制器(Deployment灰度发布/回滚、StatefulSet/Job/DaemonSet)及Service(ClusterIP/NodePort、负载均衡、多端口)等核心概念与操作,附带丰富命令示例和原理剖析。
Kubernetes (K8s) 从入门到实战:命名空间、Pod、Controller、Service,图文并茂
|
4天前
|
人工智能 安全 API
阿里云Token Plan 个人版Quick Start:最低39 元/月,主流AI工具直接接入,Credits 统一计量
阿里云百炼 Token Plan 个人版是面向个人开发者的 AI 大模型订阅服务,采用 Credits 统一计量,支持在 Claude Code、Cursor、Qwen Code 等主流 AI 编程和智能体工具中使用。目前提供 Lite、Standard、Pro 三档套餐及用量包,限时价格分别为 39 元/月、139 元/月、499 元/月。
阿里云Token Plan 个人版Quick Start:最低39 元/月,主流AI工具直接接入,Credits 统一计量
|
20天前
|
人工智能 缓存 安全
通义千问Qwen3.8‑Max深度功能解读:原生多模态、Agent实战与API调用教程
大模型产业已经从简单问答时代迈入复杂任务自主执行的新阶段,行业不再只追求单次对话的流畅度,更加看重模型处理长链路任务、自主规划纠错、工程级代码交付、多模态深度解析以及专业领域复杂推理的综合实力。Qwen3.8‑Max作为千问系列的旗舰基座模型,采用稀疏混合专家MoE架构,总参数量达到2.4万亿,单Token激活参数约95B,兼顾超高能力上限与实际推理效率,把长周期智能体执行、百万级超长上下文、原生多模态理解、工程级自主编码、专业领域深度推理等能力整合在同一基座当中,面向软件研发团队、科研机构、企业业务系统开发者、AI应用服务商提供底层能力支撑。在众多权威第三方评测榜单当中,该模型取得十分亮眼的
649 1
|
3月前
|
人工智能 自然语言处理 测试技术
告别手动画图:用自然语言生成可直接发布的 SVG+PNG 技术图
`fireworks-tech-graph`它把技术图这件事,从一次性手工劳动,变成了一种可以沉淀、复用、批量生成的 Skill 能力。在 AI/Agent 相关内容越来越多的背景下,这是一个很值得试一下的项目。
434 10
告别手动画图:用自然语言生成可直接发布的 SVG+PNG 技术图
|
3月前
|
人工智能 监控 前端开发
学习AI Agent编程-第二天-LangGraph ReAct模式实现
本文介绍了LangChain中ReAct(推理-行动)模式的实践应用:通过“会议室申请”流程,演示LLM如何循环执行“决策→调用工具→评估结果→调整策略”,实现多步任务自动化。代码涵盖流程定义、工具函数与多轮会话测试,验证了其在空闲检查、报备审批、异常处理等场景的可靠性。(239字)
446 7
学习AI Agent编程-第二天-LangGraph ReAct模式实现
|
3月前
|
数据采集 人工智能 分布式计算
多Agent集群中的"情报官"设计:为什么系统需要一个RDD
在多Agent系统中,信息采集环节的失误往往是级联错误的根源。本文从行业实践和学术研究两个维度,论证了专职情报采集Agent的必要性,并详细解析了枢衡RDD(资源探测)的五大架构设计原则,包括与CAD的对抗性协作机制等。最后提供了一套可落地的自检清单,帮助开发者判断自己的Agent集群是否需要引入专职情报官角色。
|
4月前
|
人工智能 自然语言处理 供应链
为什么 MCP 在协议层会有 prompt injection的问题:工具描述如何劫持 agent 上下文
MCP(Model Context Protocol)虽成AI Agent主流集成标准,但其将工具描述全量注入上下文的设计,导致“Context Poisoning”——恶意指令可借工具元数据污染LLM推理。OWASP将其列为LLM应用头号漏洞,2025年已致超10万站点遭袭。根本风险在于协议层信任模型缺失,非清洗不可用。
334 12
为什么 MCP 在协议层会有 prompt injection的问题:工具描述如何劫持 agent 上下文
|
4月前
|
消息中间件 网络协议 测试技术
socket长连接在手游场景下的技术实践
本文介绍了37手游基于B站goim框架自研长连接系统的实践。系统采用分层设计,支持多协议和发布/订阅机制,用于直播弹幕、实时推送等场景,实现了高性能与业务适配。
266 4
socket长连接在手游场景下的技术实践
|
3月前
|
人工智能 缓存 安全
Claude Code全攻略 命令大全+三种工作模式+记忆体系+实战工作流详解
在AI编程工具飞速迭代的当下,Claude Code凭借终端原生运行、无需依赖笨重图形IDE、深度理解项目架构的优势,已经成为主流开发者必备的效率工具。它不只是简单的代码生成助手,更能独立完成项目解读、文件批量修改、终端命令执行、程序报错修复、版本仓库管理等全流程开发工作,轻量化占用资源,适配全系统运行。
718 7
|
3月前
|
自然语言处理 监控 安全
从入门到精通:阿里云千问大模型功能详解、价格配置与API集成实战指南
阿里云千问大模型是面向个人与企业的全栈式大模型服务,覆盖文本生成、多模态理解、代码开发、知识问答、逻辑推理等全场景能力,依托阿里云百炼平台提供稳定、安全、可扩展的模型调用服务。其核心优势在于中文理解深度、长文本处理能力、多模态融合与企业级安全合规,适配个人创作、开发者集成、企业业务系统嵌入等多元需求。
610 0