如何以编程方式调用Composer 2.4的composer audit功能?
可行!直接复用Composer内部组件实现编程式审计
你可以直接复用Composer的PHP代码组件,无需调用命令行,就能实现针对指定composer.json和composer.lock文件的审计,返回结构化的结果对象。
实现步骤
1. 引入Composer核心依赖
首先在你的项目中安装Composer的核心包(作为开发依赖即可):
composer require composer/composer:^2.4 --dev
2. 编写自定义审计类
创建一个ComposerAuditor类,封装Composer内部的审计逻辑:
<?php use Composer\Audit\Auditor; use Composer\Audit\AuditResult; use Composer\Factory; use Composer\Json\JsonFile; use Composer\Package\Locker; use Composer\Repository\CompositeRepository; use Composer\Repository\PlatformRepository; use Composer\Repository\RepositoryFactory; class ComposerAuditor { public function audit(string $composerJsonPath, string $composerLockPath): AuditResult { // 加载指定的composer.json和composer.lock文件 $composerJson = new JsonFile($composerJsonPath); $composerLock = new JsonFile($composerLockPath); // 初始化Composer配置 $factory = new Factory(); $config = $factory->createConfig(); // 构建锁文件处理器,读取锁文件数据 $locker = new Locker($composerJson, $composerLock, $config); $locker->setLockData($composerLock->read()); // 获取锁文件中记录的所有依赖包仓库 $localRepo = $locker->getLockedRepository(true); // 组合审计所需的仓库集合(平台环境+本地依赖+远程Composer仓库) $repos = new CompositeRepository([ new PlatformRepository(), $localRepo, RepositoryFactory::createRepository('composer', [], $config), ]); // 初始化审计器并执行审计 $auditor = new Auditor($repos, $config); return $auditor->audit(); } }
3. 使用审计类获取结构化结果
调用自定义类,传入文件路径即可获取审计结果,结果是AuditResult对象,包含所有结构化的漏洞信息:
<?php require __DIR__ . '/vendor/autoload.php'; $auditor = new ComposerAuditor(); // 替换为你的composer.json和composer.lock路径 $result = $auditor->audit(__DIR__ . '/composer.json', __DIR__ . '/composer.lock'); // 遍历所有漏洞详情 $vulnerabilities = $result->getVulnerabilities(); foreach ($vulnerabilities as $vuln) { echo "包名:{$vuln->getPackageName()}\n"; echo "受影响版本:{$vuln->getAffectedVersions()}\n"; echo "漏洞描述:{$vuln->getDescription()}\n"; echo "修复版本:" . implode(', ', $vuln->getFixedVersions()) . "\n"; echo "-------------------------\n"; } // 获取审计统计数据 echo "总漏洞数:{$result->getTotalVulnerabilities()}\n"; echo "高危漏洞数:{$result->getHighCount()}\n"; echo "严重漏洞数:{$result->getCriticalCount()}\n";
关键说明
- 这种方式完全复用Composer官方的审计逻辑,和命令行
composer audit的结果100%一致,避免了解析命令行输出的繁琐和不可靠性。 AuditResult对象提供了丰富的方法来提取结构化数据,比如获取不同风险等级的漏洞数量、单个漏洞的详细信息等。- 确保安装的
composer/composer版本不低于2.4,对应composer audit功能的最低支持版本。
内容的提问来源于stack exchange,提问作者Kevin Pfeifer
相关产品推荐
相关产品推荐

