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)。
目录
相关文章
|
1月前
|
Kubernetes 并行计算 算法框架/工具
|
1月前
|
人工智能 JSON 监控
GEO技术原理与实践:从结构化数据到AI引用率的工程化方案
本文深度解析GEO(生成式引擎优化)技术原理与落地实践,涵盖结构化数据标记(FAQ/HowTo/Article Schema)、语义相关性优化(向量检索、同义覆盖、三层内容结构)、可信度工程(E-E-A-T评分、Author/Citation Schema)及效果监测体系,助力内容被AI搜索高频引用。(239字)
|
1月前
|
存储 运维 安全
制造企业为什么需要档案管理系统?5个管理难题一次讲清
制造业数字化转型中,多数企业重点发力生产、设备智能化,却忽视了档案管理这一核心基础。制造企业的产品图纸、工艺文件、质检报告、设备台账、合规资质等档案,贯穿研发、生产、质检、售后、设备运维全流程,是企业生产经营的核心数据资产。但多数中小制造企业仍沿用纸质存档、本地散存、人工管档的传统模式,看似节约成本,却暗藏效率低、易出错、风险高、数据浪费等诸多问题。企业频发的生产返工、售后纠纷、审计处罚、设备停机等问题,大多源于档案管理混乱。本文梳理制造企业五大核心档案难题,清晰解读档案管理系统的实用价值。
|
1月前
|
SQL 安全 PHP
Xiuno BBS 审计之问题02:后台用户搜索可能造成严重性能 DoS
该漏洞存在于XiunoBBS 4.0.4后台用户/主题搜索功能中:用户输入的`$keyword`未经校验直接拼入SQL,仅依赖`addslashes()`转义,存在宽字节SQL注入(GBK下可绕过)、LIKE通配符注入(导致全表扫描DoS)及列名注入风险,属高危漏洞。
103 2
|
1月前
|
人工智能 缓存 安全
AI Agent 凭证治理实践:从长期 API Key 到临时授权
AI Agent 不再只是生成文本,它会读取数据、调用工具、触发流程。本文从工程视角讨论为什么不应把长期 API Key 直接交给 Agent,并给出临时凭证、策略绑定、运行时拦截和审计归因的治理思路。
207 2
|
1月前
|
运维 网络协议 应用服务中间件
阿里云国际站(云老大):DDoS高防切换后502错误?
某电商团队在完成阿里云DDoS高防接入、切换DNS后的第一分钟,用户页面大面积变成502 Bad Gateway,后台却显示“源站健康”。这种情况并不少见,阿里云DDoS高防切换后502错误排查往往要追溯到健康检查与源站响应之间那道隐蔽的错位。对运维来说,这不是网络断没断的问题,而是高防的“探针”和真实的用户流量走了两条不同的判断逻辑。
176 3
|
1月前
|
运维 监控 安全
阿里云国际站(云老大)DDoS攻击流量突然暴增?
大部分用户意识到被攻击,是在业务中断之后。监控报警延迟、响应流程不熟、误判攻击类型,往往让故障时间从分钟级拖成小时级。阿里云DDoS攻击应急处理的关键,不是一套大而全的预案,而是知道在流量暴增的第一时间该看什么、该动什么,以及动完之后怎么守住。理解攻击的常见场景,是后面所有操作的前提。
124 3
|
1月前
|
人工智能 NoSQL 开发工具
AI 还在装失忆?1 万 Star 开源 EverOS 有点东西,把 Agent 记忆塞进 Markdown
EverOS 是 EverMind-AI 开源的 local-first Agent 记忆运行时,将会话和 Agent 经验保存为可读、可编辑、可迁移的 Markdown 资产。
162 4
|
1月前
|
监控 中间件 测试技术
API 版本管理三大核心实践:兼容旧版、平滑升级与灰度切流
本文聚焦微服务下API版本管理,围绕兼容旧版、平滑升级、灰度切流三大核心,结合Python(FastAPI)实战,详解URL/Header版本策略、向下兼容原则、适配层实现、废弃通知装饰器及灰度中间件,提供可落地的最佳实践。(239字)
195 3
|
1月前
|
人工智能 监控 安全
130 篇保姆级 AI 编程实战教程,全部免费开源,吊打付费课!
免费开源的 Vibe Coding 零基础入门教程,GitHub 1.6w Star,130+ 篇文章覆盖 AI 编程入门、Cursor/Codex/Claude Code 三大工具、25+ 套原创项目实战、79 个 AI 编程概念大全、产品变现全流程,持续更新
207 2