composer show --outdated 不显示安全更新,因为它仅比对 composer.lock 与 packagist.org 元数据(如 /packages/list.json),不访问 https://security.symfony.com/api/advisories;漏洞检测须用 composer audit(≥2.5)或 symfony/security-checker,且需确保离线 json 缓存可用、权限正确,并配合 composer update --refresh 强制刷新元数据以拉取含修复的版本。

不能靠 composer show --outdated 查漏洞修复包——它根本不走镜像,也不查安全通告。
为什么 composer show --outdated 不显示安全更新
这个命令只比对本地 composer.lock 和 packagist.org 的元数据(如 /packages/list.json),完全不访问安全接口。即使你配了阿里云、腾讯云镜像,漏洞信息仍必须从 https://security.symfony.com/api/advisories 拉取,而镜像源不代理该地址。
-
composer show --outdated只告诉你“有新版本”,不区分是功能更新还是安全补丁 - 真正能识别 CVE 和安全修复的,只有
composer audit(≥2.5)或symfony/security-checker(PHP - 国内环境直连
security.symfony.com常因 DNS 污染或防火墙失败,audit会静默跳过,不报错也不输出
如何让 composer audit 离线使用本地漏洞库
composer audit 默认尝试读取缓存文件:~/.composer/cache/symfony-security-advisories.json(Linux/macOS)或 %APPDATA%\Composer\Cache\symfony-security-advisories.json(Windows)。只要该文件存在且可读,它就不再发网络请求。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 手动更新缓存:在能联网的机器上执行
curl -s https://security.symfony.com/api/advisories | gzip > advisories.json.gz,解压后覆盖缓存路径下的同名 JSON 文件 - CI 中统一管理:通过
COMPOSER_CACHE_DIR指向共享目录,用定时任务定期刷新该 JSON - 权限必须正确:确保运行
composer audit的用户(如www或runner)对该 JSON 文件有读权限,否则 audit 会彻底静默失效
如何确保安全补丁被真正安装
光发现漏洞不够,还得拉到含修复的版本。这一步极易卡在旧元数据缓存里——镜像站可能已同步 monolog/monolog:3.6.1(含 CVE-2026-XXXX 修复),但你本地缓存的 packages.json 还是 3.6.0 的列表。
- 强制刷新元数据:必须执行
composer update --refresh(仅 Composer ≥ 2.5 支持),它只清packages.json和provider-*.json,不碰已下载 ZIP 包,速度快且精准 - 别用
composer clear-cache:它会清空所有包缓存,下次install重新下载,反而拖慢上线 - 验证是否生效:跑
composer update --dry-run -vvv | grep "monolog/monolog",确认日志中出现目标修复版本号,且 URL 是镜像域名(如mirrors.aliyun.com)
多镜像 fallback 要配 "canonical": false
突发大规模安全更新时(比如 Log4j 类事件),单个镜像可能同步延迟或临时不可用。Composer 默认只试第一个可用源,不会自动 fallback——除非你在 repositories 里显式关掉 canonical 行为。
- 错误写法(等同于单点):
{"type":"composer","url":"https://mirrors.aliyun.com/composer/"} - 正确写法(支持轮询):
{"type":"composer","url":"https://mirrors.aliyun.com/composer/","canonical": false} - 必须同时配至少两个以上镜像,并全部设
"canonical": false,否则 fallback 无效 - 项目级配置优先于全局,若
composer.json里已有repositories,全局config -g不起作用
真正卡住安全响应的,往往不是漏洞本身,而是元数据缓存没刷新、漏洞库没离线化、或 fallback 配置形同虚设——这些地方不显眼,但一出问题就全链路阻塞。










