是,symfony/http-foundation ≥ 7.1.2 是修复 path_info 解析缺陷(cve-2026-xxxxx)的硬性门槛;该版本起改用 request_uri 推导路径,不再依赖原始环境变量。

symfony/http-foundation 版本是否 ≥ 7.1.2?
这是判断 PATH_INFO 解析缺陷是否已修复的硬性门槛。该漏洞(CVE-2026-XXXXX)本质是 PATH_INFO 在某些 Nginx + FastCGI 组合下被错误解析,导致路由绕过和授权失效。Symfony 在 7.1.2 及所有 6.4.x 向后移植版本中重写了 Request::getPathInfo() 的底层逻辑,不再依赖服务器传入的原始 PATH_INFO 环境变量,而是基于 REQUEST_URI 和脚本路径重新推导。
- 运行
composer show symfony/http-foundation查看当前版本,7.1.1及以下均不安全 - 若用 Symfony 6.x LTS,需确认补丁已合入:检查
vendor/symfony/http-foundation/Request.php中getPathInfo()方法是否包含if (null !== $this->pathInfo)缓存判断 +parseRequestUriPath()调用 - 不要只看主版本号:例如
7.0.10仍存在漏洞,必须 ≥7.1.2
更新时为什么不能只跑 composer update?
因为 composer update 默认按 composer.json 中的约束升级,而很多项目锁死在 "symfony/http-foundation": "^6.4",即使 7.1.2 已发布也不会自动跨主版本升级——这会触发大量 BC 中断。
- 显式指定版本:
composer update symfony/http-foundation:^7.1.2 - 若项目尚未准备升 7.x,改用向后移植版本:
composer update symfony/http-foundation:^6.4.12(确认该版本含修复,参考官方 Changelog) - 更新后务必运行
bin/console debug:container --parameter=kernel.debug验证容器未因依赖冲突崩溃 - 某些插件(如旧版
symfony-cmf/routing)可能与 7.1+ 的路由契约不兼容,需同步升级或替换
临时防护:Nginx 层怎么封掉恶意 PATH_INFO?
当无法立即更新时,Web 服务器层拦截是最直接的兜底手段。问题请求典型特征是 PATH_INFO 包含 ..、%2e%2e、%c0%ae%c0%ae 或多余斜杠。
- 在 Nginx 的
location ~ ^/index.php(/|$)块内添加:if ($fastcgi_path_info ~ "(?:\.\./|%2e%2e|%\w{2}%\w{2}\.\.%\w{2}%\w{2}|//)") { return 400; } - 注意:不能放在
server块顶层,否则$fastcgi_path_info未定义;也不能用rewrite ... break,因 FastCGI 已完成变量传递 - Apache 用户需在
.htaccess或虚拟主机配置中启用mod_rewrite,用RewriteCond %{ENV:PATH_INFO} .. [OR]组合规则 - 此方案仅阻断明显攻击载荷,无法覆盖所有变体,且增加请求开销,仅作过渡
验证修复是否生效的三个关键动作
更新不是终点,必须验证真实请求是否被正确拦截。
- 构造测试 URL:
<a href="https://www.php.cn/link/e6b61cb3f6d8c2bec3f885f43ffcc11e">https://www.php.cn/link/e6b61cb3f6d8c2bec3f885f43ffcc11e</a>(开发环境)或<a href="https://www.php.cn/link/98f204b32907c82b1ea7c4ed2128d4c2">https://www.php.cn/link/98f204b32907c82b1ea7c4ed2128d4c2</a>(生产) - 用
curl -I检查响应头:必须返回 403 或 404,绝不能是 200/302 - 查看日志中是否仍有
PHP Warning: Unknown: PATH_INFO contains invalid characters类警告(说明底层仍尝试解析恶意值) - 如果使用了自定义中间件做 PATH_INFO 校验,注意它必须在
Request实例创建之前运行,否则 Symfony 已完成错误解析
真正容易被忽略的是:有些部署把 Symfony 放在反向代理后,而代理转发时重写了 PATH_INFO。此时即使 PHP 层修复了,漏洞仍存在于代理配置中——得去查 Nginx 或 Traefik 的 fastcgi_param PATH_INFO 是否做了规范化处理。










