CVE-2026-44928 严重影响安全机制,EqualsUri 函数误判语义不同 URI 为相等,导致白名单、缓存、鉴权三重失效,引发开放重定向、越权访问、缓存污染及签名绕过;PHP 8.5.7 已改为严格字面比较,需全面重构依赖旧逻辑的代码。
影响非常大,尤其对依赖 URI 相等性判断的安全机制而言——不是“可能被绕过”,而是“已被设计用于绕过”。CVE-2026-44928 的核心问题是 EqualsUri 函数族把语义不同的 URI 判定为相等,这种误判会直接穿透白名单、缓存、鉴权三层防线。
很多系统用 URI 字符串做权限校验或跳转放行,比如 OAuth 回调地址白名单、后台跳转链接过滤、API 网关路由匹配。旧版 EqualsUri 会认为以下 URI “相等”:
https://trusted.com/callback?state=abc vs https://trusted.com/callback?state=abc%0A&evil=1(fragment 或 query 含不可见控制字符)https://api.example.com/v1/users vs https://api.example.com/v1%2Fusers(路径中 %2F 是否解码未统一)https://site.com/?a=1&b=2 vs https://site.com/?b=2&a=1(query 参数顺序不同但被判定相同)攻击者只需微调编码、插入空格或调整参数顺序,就能让恶意 URI 被白名单逻辑“认可”,从而完成开放重定向、CSRF 助攻或越权访问。
若用原始 URI 字符串作缓存 key(如 Redis 或 CDN 缓存),EqualsUri 误判会让两个实际含义不同的请求映射到同一个缓存条目:
立即学习“PHP免费学习笔记(深入)”;
https://shop.com/product?id=123&ref=aff1
https://shop.com/product?id=123&ref=aff2
这类问题在高并发场景下不易复现,但一旦发生,影响范围广、排查成本高。
部分系统对 URI 做哈希或签名用于防重放、接口限流或幂等控制。EqualsUri 误判会导致:
这不是边缘情况——只要业务代码里出现 uriEqualsUri()、http_build_url() 或自定义字符串比较,就可能中招。
PHP 8.5.7 中,EqualsUri 系列函数不再宽松比较。新 UriRfc3986Uri::equals() 方法严格区分字面值与规范形式:
normalize())这意味着:升级不是“加个补丁”,而是让 URI 比较从模糊匹配变为语义精确匹配。所有依赖旧逻辑的代码必须重新验证,不能假设“看起来一样就算合法”。