gumslone/laravel-package-url

GitHub: gumslone/laravel-package-url

为 Laravel 提供完整 purl 规范实现的软件包 URL 解析、构建、规范化与双向 URL 转换库。

Stars: 0 | Forks: 0

# laravel-package-url [![tests](https://static.pigsec.cn/wp-content/uploads/repos/cas/6b/6b52945adbf8d9e421fe243515ae54cfbd3da263f16b1eabda37cdc0b797b8eb.svg)](https://github.com/gumslone/laravel-package-url/actions/workflows/tests.yml) [![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) [Package URL (purl)](https://github.com/package-url/purl-spec) for Laravel — 解析、构建、规范化和验证 purl,**外加** registry / repository / 下载 URL 解析、漏洞数据库 ecosystem 映射,以及 从 VCS URL 进行反向解析。 其核心是 purl 规范的忠实且轻依赖实现,通过了**整个官方 `package-url/purl-spec` 一致性测试套件**(基础 规范 + 所有 40 多种类型定义)—— 这与 [packageurl-php](https://github.com/package-url/packageurl-php) 和 [packageurl-python](https://github.com/package-url/packageurl-python) 所测试的 套件相同 —— 并且进一步提供了您在应用中实际需要的辅助功能。 ## 安装说明 ``` composer require gumslone/laravel-package-url ``` service provider 和 `Purl` facade 会被自动发现。 ## 核心功能:解析、构建、规范化、验证 ``` use Gumslone\PackageUrl\PackageUrl; $purl = PackageUrl::fromString('pkg:composer/laravel/framework@11.55.0'); $purl->type; // "composer" $purl->namespace; // "laravel" $purl->name; // "framework" $purl->version; // "11.55.0" $purl->qualifiers; // [] $purl->subpath; // null (string) $purl; // "pkg:composer/laravel/framework@11.55.0" $purl->toArray(); // ['type' => 'composer', 'namespace' => 'laravel', ...] // Build from components (with normalization + validation) PackageUrl::fromArray([ 'type' => 'PYPI', 'name' => 'Django_package', 'version' => '1.11.1', ])->toString(); // "pkg:pypi/django-package@1.11.1" (type + name normalized) // Immutable withers + equality $purl->withVersion('12.0.0'); $purl->withoutVersion(); $purl->equals('pkg:composer/laravel/framework@11.55.0'); // true ``` 规范化遵循规范:type 会被转为小写,qualifier 键会被 转为小写/排序并丢弃空值,subpath 会被清理,并且 会应用特定类型的规则(例如 `pypi` 会将名称转为小写并将 `_` 转换为 `-`;`github`/`bitbucket`/`golang` 会将 namespace 和 name 转为小写)。无效的 purl 会抛出 `PackageUrlException` —— 包括各类型的特定规则,例如 `swift` 需要 namespace,`vcpkg`/`otp` 禁止使用 namespace,以及 `chrome-extension` 的 id/version 格式。 ## 扩展功能:`Purl` facade ``` use Purl; Purl::isValid('pkg:npm/left-pad@1.3.0'); // true Purl::parse('pkg:npm/left-pad@1.3.0'); // PackageUrl Purl::parseMany([...]); // Collection, invalid skipped ``` ### Registry、repository 和下载 URL ``` Purl::repositoryUrl('pkg:composer/laravel/framework@11.55.0'); // https://packagist.org/packages/laravel/framework Purl::repositoryUrl('pkg:pypi/django@5.0'); // https://pypi.org/project/django/5.0/ Purl::registryApiUrl('pkg:npm/left-pad@1.3.0'); // https://registry.npmjs.org/left-pad Purl::downloadUrl('pkg:npm/@babel/core@7.0.0'); // https://registry.npmjs.org/@babel/core/-/core-7.0.0.tgz Purl::downloadUrl('pkg:maven/org.apache.commons/commons-lang3@3.14.0'); // https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar ``` 覆盖范围与 packageurl-python 的 `purl2url` 相匹配(并进行了扩展): - **repositoryUrl** — cargo, bitbucket, github, gitlab, gem, cran, npm, pypi, composer, nuget, hackage, golang, cocoapods, maven(外加 hex, pub, conda)。 - **downloadUrl** — cargo, gem, npm, maven, hackage, nuget, github, gitlab, bitbucket, hex, golang, pub, swift, luarocks, conda, alpm, deb, apk。 `download_url` qualifier 始终具有优先权。发行版 artifact URL (deb/apk/alpm/conda) 会读取相关的 qualifier (arch, repo, channel, …)。 ### 漏洞数据库 ecosystem 映射 ``` Purl::osvEcosystem('pkg:pypi/django@5.0'); // "PyPI" (OSV.dev) Purl::osvEcosystem('pkg:composer/laravel/framework@11.0'); // "Packagist" Purl::githubEcosystem('pkg:npm/left-pad@1.3.0'); // "NPM" (GitHub Advisories) ``` ### 从 URL 反向解析 从 VCS repository URL: ``` Purl::fromRepositoryUrl('https://github.com/laravel/framework'); // pkg:github/laravel/framework Purl::fromRepositoryUrl('git@github.com:laravel/framework.git'); // pkg:github/laravel/framework Purl::fromRepositoryUrl('https://github.com/laravel/framework/tree/v11.0.0'); // pkg:github/laravel/framework@v11.0.0 ``` 从**下载 / registry URL** —— 即 `downloadUrl()` 的逆向操作: ``` Purl::fromDownloadUrl('https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz'); // pkg:npm/left-pad@1.3.0 Purl::fromDownloadUrl('https://files.pythonhosted.org/packages/ab/cd/Django-5.0-py3-none-any.whl'); // pkg:pypi/django@5.0 Purl::fromDownloadUrl('https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar'); // pkg:maven/org.apache.commons/commons-lang3@3.14.0 Purl::fromDownloadUrl('https://github.com/laravel/framework/archive/refs/tags/v11.0.0.tar.gz'); // pkg:github/laravel/framework@v11.0.0 // Try both, whichever matches Purl::fromUrl($anyPackageOrRepoUrl); ``` 识别范围涵盖(并扩展了) packageurl-python 的 `url2purl`:npm (包括 yarnpkg 镜像)、PyPI(CDN 文件、`/packages/source`、project/JSON API)、RubyGems、crates.io、NuGet、Maven、Go(proxy + pkg.go.dev)、Hex、 Composer/Packagist、pub.dev、CocoaPods、Hackage、LuaRocks、CRAN、SourceForge 和 Google Code 归档(→ `pkg:generic`),以及完整的 GitHub / GitLab / Bitbucket 范围 —— 包括 web、REST API (`api.github.com/repos`)、 `codeload.github.com`、archive/release/download 以及 `raw`/`blob`/`tree`/ `commit` 引用。对于任何无法识别的内容,将返回 `null`。 ## 推荐搭配使用 - [`gumslone/laravel-purl2cpe`](https://github.com/gumslone/laravel-purl2cpe) — 从精选的 scanoss/purl2cpe 数据库中将 purl 解析为其对应的 NVD CPE (vendor/product)。 ## 测试 ``` composer install composer test ``` 该测试套件会运行 `tests/data` 下捆绑的官方一致性测试数据。 ## License MIT。请参阅 [LICENSE](LICENSE)。捆绑的测试 fixtures 来自 package-url/purl-spec,同样遵循 MIT License。
标签:ffuf, Laravel, OpenVAS, Package URL, PHP, URL解析, 规范化, 软件组件分析