gumslone/laravel-purl2cpe
GitHub: gumslone/laravel-purl2cpe
一个 Laravel 包,利用约 4.7 万条人工校验的离线映射数据,将 Package URL 精准转换为 NVD CPE 标识。
Stars: 0 | Forks: 0
# laravel-purl2cpe
[](LICENSE)
[](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, 开发工具, 漏洞管理, 跌倒检测, 软件物料清单