Xiuno BBS 审计之问题15:PHP 8下SMTP 的功能不可用

简介: 本文揭示Xiuno BBS 4.0.4中PHPMailer兼容类因使用已移除的`each()`函数,在PHP 8.0+下触发Fatal Error,导致邮件功能全面失效。文中定位3处问题代码,并提供`foreach`替换方案及升级建议,供开发者快速修复兼容性问题。(239字)

此文章为XIUNOX版本重构审计时发现问题,XIUNOX版本已优化修复此问题。分享出来方便后续想基于xiuno bbs4.0.4版本制作维护版本或插件模板等需求的开发者和站长参考。

问题:each() 函数在 PHP 8.0 被移除,发送邮件时 Fatal error

现象

Xiuno BBS 4.0.4 内置的 PHPMailer 兼容类(位于 xiunophp/xn_send_mail.func.php)使用 each() 函数遍历数组。each() 在 PHP 7.2 被废弃,PHP 8.0 起整体移除。任何调用 each() 的代码在 PHP 8 下都会抛出 Fatal error: Uncaught Error: Call to undefined function each(),导致用户注册、找回密码、邮件通知等所有依赖 SMTP 的功能不可用。

源码证据

文件 xiunobbs_4.0.4/xiunophp/xn_send_mail.func.php 共 3 处 each() 调用:

// 第 1827 行:EncodeQPphp() 中遍历 $lines
public function EncodeQPphp( $input = '', $line_max = 76, $space_conv = false) {
    $hex = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
    $lines = preg_split('/(?:\r\n|\r|\n)/', $input);
    $eol = "\r\n";
    $escape = '=';
    $output = '';
    while( list(, $line) = each($lines) ) {        // <-- PHP 8 Fatal error
      $linlen = strlen($line);
      ...
// 第 2933 行:邮件行折叠处理
while(list(,$line) = @each($lines)) {              // <-- PHP 8 Fatal error
  $lines_out = null;
  if($line == "" && $in_headers) {
    $in_headers = false;
  }
// 第 2962 行:发送邮件时拆分行
while(list(,$line_out) = @each($lines_out)) {      // <-- PHP 8 Fatal error
  if(strlen($line_out) > 0)
  {
    if(substr($line_out, 0, 1) == ".") {
      $line_out = "." . $line_out;
    }
  }
  fputs($this->smtp_conn,$line_out . $this->CRLF);

注:xiunophp/array.func.php 第 135-136 行原本也使用过 each(),作者已注释掉并改写为 foreach,注释明确写道 // php 7.2 deprecated each(),说明作者已知该问题但未同步修复 xn_send_mail.func.php

// xiunophp/array.func.php 第 134-137 行(已修复)
foreach($orderby as $k=>$v) {
    // php 7.2 deprecated each()
    //list($k, $v) = each($orderby);

风险等级与结论

兼容障碍(致命)each() 在 PHP 8.0 被移除,调用即 Fatal error: Call to undefined function each()

危害:

  1. route/user.php 第 5 行 include _include(XIUNOPHP_PATH.'xn_send_mail.func.php'); —— user 路由文件每次请求都会加载此 PHPMailer 类,但类定义本身不会立即触发错误;当用户开启 user_create_email_onuser_resetpw_on 并实际调用邮件发送(EncodeQPphp、SMTP fputs 流程)时直接 Fatal error。
  2. 第 1827 行 EncodeQPphp() 是 Quoted-Printable 编码路径,几乎所有 HTML 邮件都会触发。
  3. 第 2933、2962 行在 SMTP 协议层处理行折叠,任何通过 SMTP 发送的邮件都会触发。

修复建议:

  1. 将三处while(list(,$v) = each($arr))改为foreach($arr as $v)
  • 第 1827 行:foreach($lines as $line) {
  • 第 2933 行:foreach($lines as $line) {
  • 第 2962 行:foreach($lines_out as $line_out) {
  1. 由于 each() 内部会推进数组指针,而 foreach 不会,需确认循环体内没有依赖数组指针位置的其他调用(当前代码未依赖,可安全替换)。
  2. 同步升级 PHPMailer 到支持 PHP 8 的版本(≥ 6.5)。
目录
相关文章
|
5天前
|
缓存 人工智能 安全
GPT-5.6 Terra与GPT-5.5性能实测:成本减半后的跑分对比与快速迁移指南
GPT-5.6 Terra 的定价为每百万 token 输入 2.50/输出 15。GPT-5.5 则是 5/ 30。Terra 的每一项费率,包括 $0.25/M 的缓存读取,都恰好是 GPT-5.5 的一半,因此在任何工作负载组合下,Terra 都固定 便宜 2.0x。以每天 10 万次请求、3K token 提示词计算,大约是 Terra 每天 2,000,GPT−5.5每天 4,000,即每月约 60,000对 120,000。问题在于:OpenAI 没有发布任何针对 Terra 的编码基准。那个著名的 91.9% Terminal-Bench 数字是 Sol 在 Ul
|
12天前
|
存储 关系型数据库 MySQL
云数据库自研存储引擎:阿里云 PolarDB 相比开源 MySQL 性能提升数倍
云数据库自研存储引擎已成为云原生数据库竞争的核心技术高地。阿里云 PolarDB 通过 X-Engine 高压缩存储、PolarStore 用户态 IO + RDMA、IMCI 列存 HTAP 三大自研引擎组合,配合物理日志、跨节点 Buffer Pool 共享、Parallel Query 五大优化,实现写性能 6 倍、压缩 3-5 倍、AP 加速 100 倍、IO 延迟 -80% 的全面超越,让客户存储成本下降 65%、DBA 人力节省 80%。
453 114
|
5天前
|
人工智能 缓存 JSON
刚刚 GPT-5.6 发布,吊打 Claude 5 和 Grok 4.5?一手实测来啦!
GPT-5.6 刚发布,跑分号称超越 Fable 5,真的假的?附一手实测,让 3 个最强 AI 编程模型 GPT-5.6 Sol、Claude Fable 5、Grok 4.5 在 Cursor 里同时一把梭开发网页游戏,看看最新模型到底谁更能打。
308 0
|
5天前
|
存储 人工智能 JSON
Qwen 本地部署搭配 ComfyUI 生成 AI 漫剧完整实操指南(小白零基础可落地,零成本无限生成+角色一致性天花板)
2026全网最优本地漫剧流水线:零成本、离线运行、角色统一、低配(8G显卡)可跑。融合Qwen本地大模型+ComfyUI双引擎,实现剧本生成→分镜绘图→动态成片全自动,隐私安全、无审核限流,新手30分钟上手,日更无忧。(239字)
|
12天前
|
人工智能 编解码 物联网
2026 最新Stable Diffusion 本地部署教程 下载安装使用详细图解(含官网安装包)
Stable Diffusion(SD)是2022年发布的开源文生图模型,由Stability AI等联合开发。支持文生图、图生图、局部重绘等,依托VAE降低算力需求,可在消费级显卡运行。本文提供秋葉aaaki制作的Windows整合包(含图形界面与插件),开箱即用,零配置启动。
|
28天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)
|
1天前
|
缓存 UED 开发者
Codex109天重置23次,明天还要再送一次
Codex近109天完成23次额度重置,7月14日将迎来第24次。Tibo高频响应用户反馈:优化GPT-5.6高消耗问题、补发失效福利、调整重置时间——形成“反馈→回应→修复→补偿”正向闭环,彰显以用户为中心的产品哲学。(239字)
406 11