composer.lock不能直接用作资产指纹归档,因其仅记录包名、版本、dist.url和dist.shasum,存在四大缺口:dist可能被跳过、dist.url动态易失效、缺失文件级落地态信息、无自身签名机制;安全归档需同步采集已安装包详情、各vendor/composer.json、文件级哈希及环境元数据,并对归档包GPG签名。

Composer 本身不提供资产指纹归档能力,必须通过外部机制补全 —— 直接依赖 composer.lock 文件做“归档”在敏感行业是高风险操作。
为什么 composer.lock 不能直接当指纹归档用
它只记录包名、版本、dist.url 和 dist.shasum,但这些字段存在明显缺口:
-
dist.shasum是下载包的 SHA256,但 Composer 安装时可能跳过 dist(比如启用了prefer-source或包无 dist 发布) -
dist.url可能指向 GitHub/GitLab 等动态地址,链接失效或内容被篡改后,shasum失去比对基础 - lock 文件不包含 vendor 目录内实际写入的文件列表、权限、修改时间等运行时落地态信息
- 没有签名机制,lock 文件自身可被静默篡改(例如本地恶意脚本重写)
安全归档必须捕获的 4 类指纹数据
敏感行业审计要求的是“可重现、可验证、不可抵赖”的依赖快照,需同时采集:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer show --installed --format=json输出:确认当前已安装包的精确源(source.type是 git 还是 zip)、source.reference(如 commit hash)、dist.shasum(如有) - vendor 目录下每个包的
composer.json原始内容(含name、version、type)—— 防止包作者在 packagist 上撤回旧版描述 - 每个包根目录的
git ls-tree -r --long HEAD(若为 source 安装)或sha256sum **/*(若为 dist 安装),覆盖所有文件级哈希 - 归档动作发生时刻的
composer --version、PHP 版本、OS 信息,写入元数据文件archive-manifest.json
推荐归档流程:用 composer install --no-dev --prefer-dist --no-scripts + 自定义校验脚本
避免 dev 依赖污染、强制走 dist 渠道(更可控)、禁用 scripts(防执行期篡改)。再配合以下操作:
- 执行前先运行
composer config --global secure-http true,确保所有包源走 HTTPS - 用
composer global require symfony/flex并启用symfony.lock(非必需,但可多一层约束) - 归档脚本中调用
find vendor/ -name 'composer.json' -exec sha256sum {} \;,而非只读顶层 lock - 将最终生成的 tar.gz 用 GPG 私钥签名:
gpg --detach-sign --armor project-deps-20240615.tgz,公钥提前备案至安全部门
最容易被忽略的合规断点:私有包仓库的证书与域名绑定
如果项目依赖内部 Packagist 或 Satis 服务,composer.lock 里的 dist.url 是类似 https://pkgs.internal.example.com/mypkg.zip 的地址。此时归档必须同步保存:
- 该域名当前有效的 TLS 证书链(
openssl s_client -connect pkgs.internal.example.com:443 -showcerts) - 对应 DNS 解析记录(
dig +short pkgs.internal.example.com),防止未来 DNS 劫持导致重放攻击 - 私有仓库自身的元数据快照(如 Satis 的
packages.json文件),否则无法验证当时“可用版本集”是否被事后删减
没存这些,归档就只是个带哈希的压缩包,不是审计意义上的可信证据。

















