PHP 8.5.1 修复 URI 扩展问题:SEGV、host 丢失与通用安全更新
PHP 8.5 于 2025-11-20 发布,内置 URI 扩展支持 RFC3986 和 WHATWG URL 标准,底层基于 Lexbor 解析 URL/HTML。相比继续依赖 parse_url() 的边缘行为和第三方库,这是官方替代方案。但如果要把 \Uri\WhatWg\Url 或相关 WHATWG 解析用于生产,需要注意 8.5.0 到 8.5.1(2025-12-18 安全更新)之间修掉的坑。
8.5.1 修复的 URI/Lexbor 问题
- GH-20502:
\Uri\WhatWg\Url解析格式错误的 URL 时,Lexbor 内存损坏导致 SEGV 崩溃。生产环境只要喂到畸形 URL,进程就可能直接崩掉。 - GH-20501:调用
withPath()或withQuery()后,URL 对象丢失 host。在 URL 改写/重定向场景中很难发现:你以为只改了路径,实际 host 已经被清空。 - GH-20366:ext/uri 遇到 null byte 时,错误地抛出
ValueError(行为 bug)。 - CVE-2025-67899:uriparser 0.9.9 及更早版本允许无限制递归和堆栈消耗。含大量逗号的输入会触发
ParseMustBeSegmentNzNc,可用于 DoS。8.5.1 升级到了修复后的 uriparser。
全分支同步修复的通用安全问题
8.5.1 / 8.4.16 / 8.3.29 / 8.2.30 同步修复了四个全分支通用问题,生产环境建议跟到对应分支的补丁版本:
- CVE-2025-14178:
array_merge()堆缓冲区溢出 - CVE-2025-14177:
getimagesize()内存信息泄露 - CVE-2025-14180:PDO 引用结果 null 解引用
- GHSA-www2-q4fc-65wf:
dns_get_record()空字节终止
安全扫描器(如 Nessus)已经报告 “Exploits are available”,不能只当普通功能更新看。
生命周期提醒
PHP 8.1 及更早版本在 2025-12-31 后 EOL,不再有安全更新。线上如果还在这些版本,需要先解决升级路径。
落地建议
- 使用 PHP 8.5 URI 扩展时,不要停留在 8.5.0,至少升到 8.5.1。重点验证:畸形 URL 不触发 SEGV,
withPath()/withQuery()之后 host 仍然保留。 - 用
\Uri\WhatWg\Url做 URL 改写或白名单校验时,对结果再断言一次scheme和host,不要只看path。 - 生产 PHP 最低版本:8.2.30 / 8.3.29 / 8.4.16 / 8.5.1。
参考:php.net ChangeLog-8