必须用syft扫描vendor/目录生成合规sbom,因其能递归提取composer.json等文件的完整元数据(含许可证全文、sha256、purl、源仓库url),而composer show/export仅输出扁平快照,缺失关键字段且无法被sca工具解析。

不能靠 composer show 或 composer export 生成合规 SBOM —— 它们不带许可证全文、没哈希值、缺 PURL/CPE、不反映嵌套依赖路径,SCA 工具(如 DependencyTrack、Defender for Cloud)根本无法 ingestion。
为什么 composer show --format=json 不是 SPDX SBOM
它只是 vendor/ 下已安装包的扁平快照,字段极度精简:name、version、description、source.type,但关键字段全空或无效:
-
license字段 90% 为null或空数组,用jq '.[] | "\(.name) \(.version) \(.license // "UNKNOWN")"'提取结果全是UNKNOWN -
purl和cpe字段完全不存在 -
sha256哈希值恒为"0000000000000000000000000000000000000000000000000000000000000000" - 不区分
distvssource安装方式,而审计需知道是否含构建产物 - 不包含源仓库 URL(
source.url可能为空,dist.url是 CDN 地址,非源码出处)
生产环境必须用 syft 扫描 vendor/
syft 是目前唯一能从实际文件系统结构中提取完整元数据的工具,它递归读取每个包的 composer.json、package.xml、README,甚至尝试从注释中推测许可证,并自动计算目录级 sha256。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须在
composer install --no-dev成功后执行,否则vendor/缺包导致扫描遗漏 - 命令要显式指定解析器:
syft php:./vendor --output sbom.cdx.json -o cyclonedx-json,否则可能误判为 Ruby/Git 项目 - 绝对不要运行
syft .—— 它会把根目录composer.json当作 manifest,漏掉vendor/中实际加载的类路径信息 - Azure Pipelines 中需在
UsePhp@1后立即运行,避免 job 缓存导致vendor/为空
composer export --without-dev 是最小可信快照,不是 SBOM
它只重建一个不含 require-dev 的 lock 文件,用于基线比对或喂给 Dependabot,但依然缺失 SPDX 所需的组件级元数据:
- 不生成
externalReferences(PURL/CPE/Source URL) - 不提供许可证全文或标准化 ID 映射(如把
"MIT"转为 SPDX 官方文本) - 不包含任何哈希值或构件来源标识
- 不能替代
syft输出的CycloneDX或SPDX格式
真正合规的 SBOM 必须来自对 vendor/ 目录的物理扫描,而非对声明文件的逻辑解析;最容易被忽略的是:不加 --scope local 和解析器限定时,syft 会跳过 PHP 包识别,直接输出空结果。










