编程 PHP 8.5 新 URI 扩展的坑:畸形 URL 会 SEGV、withPath/withQuery 后丢 host,8.5.1 才修

2026-09-05 21:04:42

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 改写或白名单校验时,对结果再断言一次 schemehost,不要只看 path
  • 生产 PHP 最低版本:8.2.30 / 8.3.29 / 8.4.16 / 8.5.1。

参考:php.net ChangeLog-8

复制全文 生成海报 PHP URI 安全更新 踩坑 版本升级

推荐文章

程序员茄子在线接单