不能。composer security:check 只检测当前 composer.lock 中依赖的已知活跃漏洞,不提供历史 advisory 记录、修复版本变更或撤回信息,其数据源为 symfony 安全数据库的实时快照,无时间维度字段。

composer security:check 能查到历史 advisories 吗?
不能。composer security:check(或已废弃的 composer audit)只检查当前锁文件中依赖的**已知活跃漏洞**,不提供时间维度的历史记录、修复版本变更或 advisory 撤回信息。它调用的是 Composer 官方维护的实时快照式数据库,不是带时间线的审计日志。
实操建议:
- 该命令本质是向
https://security.symfony.com发送当前composer.lock的 hash 查询,响应里只有「是否含已知高危漏洞」和对应CVE或Symfony Security Advisory ID,没有日期、披露时间、补丁版本范围等字段 - 如果你刚升级了某个包,但
composer security:check仍报旧漏洞,大概率是因为composer.lock没更新(composer update xxx后漏了composer install或没提交 lock 文件) - 想确认某次升级是否真正修复了某个 advisory?得手动比对 advisory 页面上的「Fixed in」版本号与你 lock 文件里该包的
version字段
怎么查某个包在 security-advisories 数据库里的完整历史?
直接查 GitHub 上的原始数据源:symfony/security-advisories 仓库。这是 Composer 所有安全检查背后的真实数据库,每条 advisory 都是一个独立 commit,带完整时间戳、描述、影响版本范围和修复版本。
实操建议:
- 打开
https://github.com/symfony/security-advisories,用页面右上角的 search(不是 GitHub 全局搜索),输入包名,比如monolog/monolog - 搜到的结果是匹配到的 advisory 文件路径,例如
monolog/monolog/CVE-2023-46805.yaml—— 点进去就能看到published时间、fixed版本、branches(影响哪些主版本)、甚至原始报告链接 - 想看某包所有 advisory 按时间倒序排列?用 GitHub 的
git log --oneline monolog/monolog/(在仓库里点「Code」→「Open with GitHub CLI」或本地 clone 后执行) - 注意:yaml 文件名里的
CVE-xxxx-xxxx不一定真实存在 CVE 编号,Symfony 有时会自编 ID(如SYMFONY-2022-1234),别硬去 NVD 网站搜
composer show --outdated -s 能替代 advisory 历史查询吗?
不能替代,但能辅助判断风险暴露窗口。它只显示「当前项目所用版本是否落后于最新稳定版」,不说明落后版本是否存在已知漏洞,也不告诉你哪个版本开始修复了哪个 advisory。
实操建议:
-
composer show --outdated -s输出里的latest列只是 packagist.org 上标记为 stable 的最高版本,和 advisory 的fixed版本可能不一致(比如修复版被标为RC或beta,就不会出现在latest) - 常见坑:一个包在
composer show --outdated里显示「无更新」,不代表安全 —— 可能最新 stable 版仍含未修复漏洞,或者你用的是带 patch 的 fork 分支,而 advisory 只覆盖官方 release - 真正要闭环验证,得把
composer.lock里该包的version和对应 advisory yaml 中的branches+fixed逐条比对,尤其注意 caret range(如^1.25)是否被实际满足
有没有命令行方式批量查多个包的 advisory 历史?
没有官方命令,但可以用 shell 快速抓取。核心思路是:从 composer.lock 提取包名 → 对每个包构造 GitHub API 请求 → 解析返回的 yaml 内容。
实操建议:
- 简单脚本示例(需安装
curl和jq):jq -r '.packages[].name' composer.lock | \ sort -u | \ while read pkg; do \ url="https://raw.githubusercontent.com/symfony/security-advisories/main/$(echo $pkg | sed 's|/|/|g')/*.yaml"; \ echo "--- $pkg ---"; \ curl -s "$url" | head -n 10 | grep -E "(published|fixed|branches)"; \ done - 注意路径拼接:GitHub 上的目录结构严格按
vendor/package命名,比如laravel/framework对应路径laravel/framework/;但有些包名含特殊字符(如doctrine/orm),需确保 URL 编码正确(实际脚本中建议用urlencode工具) - 更稳的方式是 clone 整个
symfony/security-advisories仓库(约 30MB),然后用find . -name "*.yaml" -exec grep -l "monolog/monolog" {} \;本地检索,避免 API 限流或网络抖动
查 advisory 历史最麻烦的从来不是找数据源,而是搞清「我用的这个具体版本号」到底落在 advisory 描述的哪个 branches 区间里 —— YAML 里写的 ^2.0 和你 lock 文件里存的 2.10.2 是否真被覆盖,得手算一次 semver 范围,这点工具几乎都不自动做。










