source 数组即漏洞传播最短依赖路径,顺序表示实际依赖流向,需结合 composer show --tree 验证真实安装路径,并关注 source[-2]→source[-1]定位可干预点。

直接看 advisories 数组里每个条目的 source 字段,它就是漏洞传播的最短关联路径,不是调用栈,也不是你代码里写的 require,而是从项目根到触发点的实际依赖链。
怎么从 composer audit --format=json 提取真实风险路径
source 是一个数组,比如 ["myapp", "monolog/monolog", "phpunit/phpunit"],顺序表示依赖流向:你的项目 → monolog → phpunit。末尾不一定是漏洞包本身,可能是它拉进来的 sebastian/version 这类子依赖。
- 别只盯
title或severity就去升级——同一漏洞可能出现在多条路径,advisories会重复出现多个条目,每条都得单独看 - 用
jq快速聚焦你能干预的位置:composer audit --format=json | jq -r '.advisories[] | select(.source | length > 2) | "\(.source[-2]) → \(.source[-1]) | \(.title)"' - 如果
source[-2]是你自己的包(如acme/internal-sdk),就得去它自己的composer.json改require;如果是第三方包(如guzzlehttp/guzzle),先查它最新版是否已修复,没修复就只能等或换方案
composer show --tree 是验证路径是否真实存在的唯一手段
composer audit 只比对 composer.lock 里的精确版本,但路径是否存在、是否被实际安装,得靠 composer show --tree 看真实快照。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须加
--no-dev:否则phpunit等开发依赖会干扰主线路径判断 - 加具体包名提速:
composer show --tree --no-dev monolog/monolog比全量输出快得多 - 看到同一包在不同缩进层级出现多次?说明有多条引入路径,版本很可能被某一层硬锁死,这就是冲突根源
- 输出里带
(locked to x.y.z)的,是composer.lock固定的结果,不是你composer.json写的“应该”
为什么路径在 audit 输出里找不到
不是漏洞不存在,而是 audit 根本没扫描到那条路径——它只扫当前 composer.lock 中实际安装的部分。
-
composer install没跑过,或者composer.lock过期未更新,audit就无从比对 - 用了
--no-dev安装,但漏洞在require-dev里,默认不扫,得显式加--dev - 本地 PHP 版本低于漏洞规则要求的最低版本(比如 advisory 写
^8.1,你用的是 7.4),audit会跳过该条目 - 私有包、fork 包、
dev-main这类非 Packagist 包,audit一律不查
真正麻烦的不是看到路径,而是路径里夹着你无法控制的中间层——比如 laravel/framework 锁死了某个 symfony/* 版本,而这个版本又依赖了带漏洞的 psr/log,你既不能改 Laravel,也不能让 Symfony 主动降级。这时候 conflict 字段才是唯一能硬控的出口。

















