pre-package-install是唯一可用的安装前校验入口,需在插件activate()中监听该事件,通过packageevent获取包元数据并轻量校验,失败时抛出runtimeexception中断安装。

pre-package-install 事件是唯一能介入安装前校验的入口
Composer 不提供“下载前校验包哈希”的公开钩子,pre-package-install 是最接近且唯一可用的时机。它发生在包解压前、但已确定要安装该包之后,此时你能拿到 Package 对象和完整元数据,但不能修改包内容,也不能阻止 Composer 已缓存的损坏包被复用。
- 这个事件回调必须在插件的
activate()方法中注册,用字符串"pre-package-install"(不是ScriptEvents::PRE_PACKAGE_INSTALL) - 回调函数接收
PackageEvent实例,调用$event->getOperation()->getPackage()获取目标包 - 校验逻辑必须轻量:只读取
$package->getName()、$package->getVersion()、$package->getDist()['sha256'] ?? null等字段,不要发起网络请求或访问文件系统 - 失败时抛出
RuntimeException,Composer 会中断当前包安装并显示错误,但不会回滚已成功安装的其他包
verify-checksums --strict 不是安装前校验,而是安装后验证
很多人误以为 composer verify-checksums --strict 能替代前置校验,但它完全不是一回事:
- 它必须配合
COMPOSER_EXPERIMENTAL=1才可用,且只在校验已落地到vendor/的文件,时机晚于安装 - 它计算的是磁盘上实际文件的 SHA256,并与
composer.lock中的dist.sha256比对,无法防止坏包被写入 vendor - 若你用
--prefer-source或镜像源替换了 dist 包但没同步哈希,verify-checksums会跳过或报 mismatch,但这时包早已装进项目里了
dist.sha256 字段不可信,除非你控制整个分发链
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer.lock 里的 dist.sha256 值来自 packagist 或你配置的仓库,它本身可能被污染:
- 私有仓库若未强制校验上传包哈希,
dist.sha256可能是伪造的 - 镜像源若同步不及时或人为替换 dist 包,
dist.sha256就失去意义 -
path类型包根本没dist字段,pre-package-install里也拿不到哈希
所以,真正可靠的前置校验只能基于可验证的外部事实,比如:
- 检查
$package->getExtra()['signature']是否匹配你预置的公钥签名 - 确认
$package->getRequire()中无已知高危 CVE 版本范围(如"monolog/monolog": "^1.0") - 结合
$io->isInteractive()在 CI 中强制校验,在本地开发时允许跳过
最危险的盲区是 vendor/autoload.php
这个文件由 Composer 自动生成,不在任何哈希校验范围内。它被篡改后,所有后续加载的类都会走恶意路径。而 pre-package-install 事件完全感知不到它——因为此时 autoload.php 还没生成。生产环境必须:
- 将
vendor/设为只读 - 部署后单独用
sha256sum vendor/autoload.php断言其内容 - 不依赖任何 Composer 内置机制来保护它










