URI::PackageURL 2.26 发布:Perl 的 PURL 与 VERS 支持

💡 原文英文,约600词,阅读约需2分钟。
📝

内容提要

URI::PackageURL 2.26 发布,实现 PURL 和 VERS 规范。主要更新 cpan 类型:命名空间改为可选,作者用 author 限定符,新增 distpath 限定符,解决发行版作者变更导致的标识不一致问题,利于 CVE 漏洞数据。PURL 默认启用验证,新增 is_purl 工具,支持 UTF-8,性能提升 39%。VERS 新增 is_vers 和多种比较器,支持自定义比较器,并修复若干问题。

🔎

延伸解读

cpan 类型变更的实际影响

新 cpan PURL 类型将命名空间改为可选,作者信息移至 author 限定符,并新增 distpath 限定符。这解决了发行版作者变更导致的标识不一致问题,例如 DBI 的 1.643 和 1.644 版本由不同作者发布,旧格式下会被视为不同包。对于生成 SBOM 或漏洞数据库的工具,建议迁移到 ?author= 形式,或在无作者信息时省略作者,以确保标识稳定。

对漏洞数据管理的意义

自 CVE Record Format 5.2.0 起,CVE 记录的 affected 部分可包含 packageURL,且规定不得包含版本号,版本信息应放在 versions 数组中。CPANSec 计划使用该字段标识 CPAN 发行版。旧 cpan 类型下,标识符如 pkg:cpan/TIMB/DBI 无法反映后续由 HMBRAND 发布的版本,而新类型简化为 pkg:cpan/DBI,能更准确地关联漏洞与所有版本。NixOS 也将采用相同格式。

PURL 与 VERS 的功能增强

PURL 方面,验证默认启用,新增 is_purl 工具,支持 UTF-8,组件验证和百分号编码改进,性能提升约 39%。VERS 方面,新增 is_vers 工具和方案验证,内置 semver、npm、intdot、lexicographic 和 datetime 比较器,百分号编码遵循规范,并修复了 vers:none/*、alpm/pypi 版本比较等问题。npm/semver 原生范围转换现在会取交集,并对不可满足的范围报错。

自定义比较器的扩展性

由于不同生态系统的版本比较规则各异,VERS 支持可插拔的比较器。开发者可以编写 URI::VersionRange::Scheme::<scheme> 类,实现 compare 方法,contains 和排序将自动使用该比较器。例如,为 rpm 方案定义比较器后,版本包含判断和排序会调用 rpmvercmp。这为处理非标准版本格式提供了灵活性,但需要确保比较器逻辑正确,以避免误判。

❓

Q&A

URI::PackageURL 2.26 中 cpan 类型的 PURL 有什么新变化?

主要变化包括:命名空间变为可选,因此 pkg:cpan/DBI@1.644 是有效的;新增 author 限定符来指定作者,如 pkg:cpan/DBI@1.644?author=HMBRAND;新增 distpath 限定符用于指定 CPAN 上归档文件的路径;命名空间形式仍保留以兼容旧工具;名称必须是发行版名称,不能是模块名称。

为什么 cpan PURL 中作者作为命名空间会导致问题?

因为发行版的作者可能随时间变化。例如 DBI 1.643 由 TIMB 发布,1.644 由 HMBRAND 发布。如果作者作为命名空间,pkg:cpan/TIMB/DBI 和 pkg:cpan/HMBRAND/DBI 会被视为两个不同的包,导致标识不一致。

新的 cpan PURL 格式如何帮助 CVE 漏洞数据?

CVE 记录格式 5.2.0 允许在 affected 部分包含 packageURL,且不能包含版本。CPANSec 计划使用该字段。旧格式如 pkg:cpan/TIMB/DBI 无法反映 HMBRAND 发布的版本,而新格式 pkg:cpan/DBI 则能统一标识,便于漏洞数据关联。

URI::PackageURL 2.26 在 PURL 方面有哪些改进?

验证现在默认启用,可通过 validate => 0 关闭;新增 is_purl 工具;支持 UTF-8(RFC 3629);改进了组件验证和百分号编码;URI::PackageURL::Type 性能提升约 39%。

URI::PackageURL 2.26 在 VERS 方面有哪些更新?

新增 is_vers 工具和方案验证;新增内置比较器:semver、npm、intdot、lexicographic 和 datetime;方案类现在被 contains、to_string、version_compare 和 from_native 使用;百分号编码遵循 vers-spec 规范并支持 UTF-8;修复了 vers:none/*、alpm/pypi 版本比较、空版本约束等问题;npm/semver 原生范围转换现在会取交集并在不可满足时 croak。

如何为 URI::VersionRange 自定义版本比较器?

可以编写一个 URI::VersionRange::Scheme::<scheme> 类,继承 URI::VersionRange::Version,并重载 cmp 和 <=> 操作符,实现 compare 方法。例如使用 RPM4 的 rpmvercmp 函数。之后 contains 和排序会自动使用该比较器。

🏷️

标签

➡️

继续阅读