composer audit 在无网环境静默失败是因为默认跳过远程请求且不读本地缓存,仅当网络通畅或存在路径正确、权限可读、格式合法的本地 JSON 缓存文件时才真正执行审计。

composer audit 为什么在无网环境静默失败
它不是“不工作”,而是默认行为:找不到 security.symfony.com 就跳过远程请求,也不报错,更不读本地缓存——除非你手动把缓存文件放对位置、且有读权限。常见现象是执行 composer audit 后直接返回空行或 “No security vulnerabilities found”,但实际根本没查。
关键点在于:composer audit 只在以下两种情况下才真正加载漏洞库:
- 网络通畅,能成功 GET
https://security.symfony.com/api/advisories - 本地存在有效 JSON 文件,路径正确、权限可读、内容格式合法
Linux/macOS 缓存路径是 ~/.composer/cache/symfony-security-advisories.json;Windows 是 %APPDATA%\Composer\Cache\symfony-security-advisories.json。注意:cache 目录名不能拼错,文件名必须是 symfony-security-advisories.json(不是 advisories.json 或带 gzip 后缀)。
如何手动同步 FriendsOfPHP 漏洞库到离线机器
官方 security.symfony.com 接口已弃用,当前真实数据源是 FriendsOfPHP/security-advisories 的 Git 仓库。它以 JSON 格式按包组织,结构清晰,适合离线导入。
实操步骤(需一台有网机器):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 克隆仓库:
git clone https://www.php.cn/link/1f3a4f7715b9fd855595b4836101ec30.git - 进入目录,运行
make build(需 Python 3.7+ 和jq),生成单个合并 JSON:build/advisories.json - 将该文件复制到离线机对应缓存路径,覆盖原文件
- 确认权限:
chmod 644 ~/.composer/cache/symfony-security-advisories.json(Linux/macOS)
不要用 curl https://security.symfony.com/api/advisories —— 该接口自 2025 年底起返回 404,继续依赖它会导致离线同步失效。
composer audit 在离线环境仍报错或忽略漏洞
常见原因不是数据库没同步,而是锁文件或配置缺失:
-
Could not find composer.lock:audit 只读 lock 文件,不看composer.json。离线机必须有完整、未篡改的composer.lock,且与 vendor 目录版本一致 -
Command "audit" is not defined:检查composer --version是否 ≥ 2.5.0,并确认已运行composer config --global experimental.audit true - 输出 “No security vulnerabilities found” 但你知道有漏洞:用
composer audit --format=json查看原始响应,若"advisories"字段为空数组,说明 JSON 文件被读取但内容为空或格式错误 - CI 中审计失败却无提示:加
--no-interaction --timeout=10避免卡住;再加--severity=critical,high确保只对高危问题退出
离线代码层漏洞分析不能只靠 composer audit
composer audit 只比对已知 CVE 和 FriendsOfPHP 数据库中的 advisory,它完全不碰你的 PHP 代码。以下情况它毫无反应:
- 你写了
eval($_GET['cmd'])—— 它不管 - 私有包(未提交到 Packagist)含漏洞 —— 它看不见
- 刚爆出的 0day,FriendsOfPHP 还没收录 —— 它不知道
- vendor 里某包被手动 patch 过,但 lock 文件未更新 —— 它按 lock 判定,结果失真
真正可行的离线代码扫描组合是:phpstan + phpstan-webmozart-assert 插件检测危险函数调用,配合 roave/security-advisories(通过 conflict 强制阻断安装已知毒包)。这两者都不需要网络,且能嵌入 composer scripts 统一调用。

















