gumslone/laravel-purl2cpe

GitHub: gumslone/laravel-purl2cpe

一个 Laravel 包,利用约 4.7 万条人工校验的离线映射数据,将 Package URL 精准转换为 NVD CPE 标识。

Stars: 0 | Forks: 0

# laravel-purl2cpe [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/donate/?hosted_button_id=VCWHQPACTXV5N) 在 Laravel 中将 [Package URLs (PURLs)](https://github.com/package-url/purl-spec) 转换为 [CPE](https://nvd.nist.gov/products/cpe) 名称,由精心整理的 [scanoss/purl2cpe](https://github.com/scanoss/purl2cpe) 数据库支持。 通过启发式方法(`vendor:product`)从包名推导 CPE 众所周知是不准确的 —— 例如 `chart.js` 的 CPE 是 `cpe:2.3:a:chartjs:chart.js`,而不是 `chart.js:chart.js`。此包提供了一个**精简的快照,包含约 47,000 条 人工校验的映射关系**,让您能够离线解析包的真实 NVD CPE, 然后将其提供给 NVD / CVE-Search / 任何以 CPE 为键的漏洞数据源。 上游数据库包含 512 MB 的特定版本行数据;此包将其精简为 去重后的 `base PURL → base CPE` 映射对(gzip 压缩后约 700 KB), 并在查询时动态替换包的版本号。 ## 安装说明 在 [Packagist](https://packagist.org/) 上发布后: ``` composer require gumslone/laravel-purl2cpe ``` 在此之前(或者如果想直接追踪 `master` 分支),请将此仓库添加到您的应用的 `composer.json` 中并要求安装它: ``` "repositories": [ { "type": "vcs", "url": "https://github.com/gumslone/laravel-purl2cpe" } ] ``` ``` composer require gumslone/laravel-purl2cpe:dev-master ``` 运行数据库迁移并加载内置的映射数据: ``` php artisan migrate php artisan purl2cpe:import ``` 这样就可以了 —— `purl2cpe:import` 会读取此包内置的快照,无需 网络连接。 ## 使用方法 通过 facade: ``` use Purl2Cpe; Purl2Cpe::toCpe23('pkg:composer/laravel/framework@11.55.0', '11.55.0'); // "cpe:2.3:a:laravel:framework:11.55.0:*:*:*:*:*:*:*" Purl2Cpe::toCpe22Uri('pkg:npm/axios@1.7.0', '1.7.0'); // "cpe:/a:axios:axios:1.7.0" Purl2Cpe::candidates('pkg:gem/http@5.0.0', '5.0.0'); // packages can map to several vendor:product pairs // ["cpe:2.3:a:httprb:http:5.0.0:...", "cpe:2.3:a:http.rb_project:http.rb:5.0.0:..."] Purl2Cpe::isMapped('pkg:composer/laravel/framework@11.55.0'); // true ``` 只需要某个 PURL 对应的 CPE **vendor 和 product**? ``` Purl2Cpe::vendorProduct('pkg:composer/laravel/framework'); // ['vendor' => 'laravel', 'product' => 'framework'] Purl2Cpe::vendorProduct('pkg:npm/chart.js'); // ['vendor' => 'chartjs', 'product' => 'chart.js'] Purl2Cpe::vendorProducts('pkg:gem/http'); // [['vendor' => 'httprb', 'product' => 'http'], ['vendor' => 'http.rb_project', 'product' => 'http.rb']] ``` 或者注入该服务: ``` use Gumslone\Purl2Cpe\Purl2Cpe; class Scanner { public function __construct(private readonly Purl2Cpe $purl2cpe) {} public function cpeFor(string $purl, ?string $version): ?string { return $this->purl2cpe->toCpe23($purl, $version); } } ``` 版本号可以显式传递,也可以从 PURL 中读取 —— 查找时使用的是 base PURL (type/namespace/name),而版本号会被注入到 CPE 的第 6 个字段中。 如果您省略了版本号,将会得到带有通配符版本的 CPE。 ## API | 方法 | 返回值 | 描述 | | --- | --- | --- | | `toCpe23($purl, $version = null)` | `?string` | 最佳的精选 CPE 2.3,已注入版本 | | `toCpe22Uri($purl, $version = null)` | `?string` | 最佳的精选 CPE 2.2 URI | | `vendorProduct($purl)` | `?array{vendor,product}` | 某个 PURL 对应的 CPE vendor + product | | `vendorProducts($purl)` | `array` | 所有的 vendor/product 映射对 | | `candidates($purl, $version = null)` | `string[]` | 所有的候选 CPE,已注入版本 | | `isMapped($purl)` | `bool` | 该 PURL 是否在目录中 | | `basePurl($purl)` | `string` | 去除版本/限定符的 PURL | | `injectVersion($baseCpe, $version)` | `string` | 将版本号替换进 base CPE 中 | | `cpe23ToCpe22($cpe23)` | `string` | 将 2.3 格式字符串转换为 2.2 URI | | `count()` | `int` | 已加载的映射数量 | ## 从上游刷新 内置的快照是一个时间点副本。如果要从最新的 上游数据重建(下载约 50 MB,临时解压后约 512 MB): ``` php artisan purl2cpe:sync ``` 或者精简您已有的数据库: ``` php artisan purl2cpe:sync --db=/path/to/purl2cpe.db ``` 通过设置计划任务来保持最新状态: ``` // routes/console.php Schedule::command('purl2cpe:sync')->monthly(); ``` ## 配置 发布配置文件以更改表名或数据库连接: ``` php artisan vendor:publish --tag=purl2cpe-config ``` ``` return [ 'connection' => env('PURL2CPE_CONNECTION'), // null = default connection 'table' => env('PURL2CPE_TABLE', 'purl_cpe_mappings'), 'db_url' => env('PURL2CPE_DB_URL', 'https://github.com/scanoss/purl2cpe/raw/main/purl2cpe.db.zip'), ]; ``` ## 精简原理 上游的 `purl2cpe.db` 将每个 base PURL 映射到一个 CPE 行,且 *每个已知版本* 都对应一行(共 260 万行)。由于 base CPE 与其各版本之间的区别仅在于 第 6 个字段,此包仅保留了去重后的 `(purl, cpe:2.3:a:vendor:product:*:...)` 映射对,并在查询时替换为真实的 版本号。仅导入应用程序类的 CPE(`part = a`)。 ## 测试 ``` composer install composer test ``` ## 开源许可证 MIT。请参阅 [LICENSE](LICENSE)。内置的映射数据派生自 scanoss/purl2cpe,同样采用 MIT 许可证。
标签:CPE映射, ffuf, GPT, Laravel, OpenVAS, PHP, SOC Prime, 开发工具, 漏洞管理, 跌倒检测, 软件物料清单