php 8.4.27 不修复“压缩包解压路径穿越漏洞”,因该漏洞并不存在于官方记录中;真实风险源于开发者未校验 ziparchive::extractto() 的目标路径或 zip 内部文件名,需手动过滤 ../ 等危险字符。

PHP 8.4.27 并不修复「压缩包解压路径穿越漏洞」——这个漏洞根本不存在于 PHP 官方公告、ChangeLog 或 CVE 列表中。你查到的所谓“路径穿越”,大概率是混淆了其他组件(如 ziparchive 扩展的误用、第三方库逻辑缺陷,或 Web 应用层未校验 ZipArchive::extractTo() 的目标路径)。
ZipArchive::extractTo() 路径穿越的真实风险点
PHP 自身的 ZipArchive 类不会自动解压到任意路径;它只按你传入的 $destination 参数执行。问题出在开发者是否做了路径净化:
- 如果用户可控的 ZIP 文件名或内部文件路径被直接拼进
extractTo(),且没过滤../,就可能写到 Web 目录外 -
ZipArchive::getFromName()返回内容不带路径检查,file_put_contents()写入时若路径未 sanitize,也会触发穿越
常见错误写法:
$zip = new ZipArchive();
$zip->open($_FILES['zip']['tmp_name']);
$zip->extractTo('/var/www/uploads/' . $_POST['project_name']); // 危险!$_POST['project_name'] 可能是 "../../../etc"
PHP 8.4.27 对 ZIP 相关行为的改动
该版本没有新增 ZIP 安全机制,也未修改 ZipArchive 的默认行为。它唯一和归档相关的变更,是修复底层内存管理缺陷(CVE-2026-109618/109619),这些漏洞不影响 ZIP 解压逻辑本身,但可能让恶意构造的 ZIP 触发崩溃后进入 RCE 链路(需配合其他条件)。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
所以:
- 升级到
PHP 8.4.27是必须的(防 RCE),但它不解决你代码里漏掉的路径校验 - 不升级,即使你写了路径过滤,仍可能被绕过(因底层状态残留可破坏过滤逻辑)
如何安全使用 ZipArchive(PHP 8.4+)
- 使用
realpath()+ 白名单根目录做路径前缀校验 - 禁用 ZIP 中的绝对路径与父目录引用(PHP 8.4 默认仍允许,需手动拦截)
- 提取前遍历所有文件名,拒绝含
../、/开头或空字节的条目
示例防护逻辑:
$zip = new ZipArchive();
if ($zip->open($file) !== TRUE) return;
for ($i = 0; $i numFiles; $i++) {
$name = $zip->getNameIndex($i);
if (str_starts_with($name, '/') || str_contains($name, '..') || str_contains($name, "\0")) {
throw new RuntimeException('Invalid path in zip: ' . $name);
}
}
$zip->extractTo($safe_base_dir);
PHP 8.4.27 本身不提供 ZIP 路径沙箱,也不自动清理恶意文件名。真正起作用的永远是你对 $destination 和 ZIP 内部条目的显式校验——这点在 8.2、8.3、8.4 甚至 8.5 都没变。别指望版本号自带“防穿越”魔法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










