conflict 是唯一能在 composer install 或 update 时原生中断高危包安装的机制,它在依赖解析阶段报错退出,阻止下载;如为修复 monolog/monolog 1.25.0 RCE 漏洞,可在根级配置 "conflict": { "monolog/monolog": ">=1.0.0,<2.0.0" }。

conflict 是唯一能在 composer install 或 composer update 时真正中断高危包安装的原生机制,其他手段(如事件脚本、镜像配置、插件)都无法阻止下载和安装流程本身。
用 conflict 字段硬拦截已知不安全版本
它在依赖解析阶段就报错退出,不进入下载环节。例如已知 monolog/monolog 的 1.25.0 存在 RCE 漏洞:
- 在
composer.json根级添加:"conflict": { "monolog/monolog": ">=1.0.0, 和 <code>>必须写成</>或英文lt/gt,否则 JSON 解析失败- 该配置对中文镜像完全透明——镜像只加速下载,不绕过
conflict校验 - 注意:它不清理已安装的旧包,
vendor/monolog/monolog不会自动删除,需手动composer remove monolog/monolog后重装
为什么 composer audit 和事件脚本不算“拦截”
composer audit 只报告风险,不中断流程;自定义事件(如 pre-install-cmd)只能做检查或告警,无法取消 Composer 内部逻辑:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer audit输出漏洞后仍可继续部署,除非加--fail-on-warnings并集成进 CI -
pre-install-cmd脚本里exit 1能终止当前命令,但用户可删掉composer.lock重来,或直接运行composer install --no-scripts - 试图覆盖
require脚本(如"require": "php check.php && composer require")极易被绕过,且 Composer 8+ 已禁用动态加载类 - 所有事件钩子都无法捕获
composer update foo/bar这类带参数的子命令
靠 composer.lock + 签名验证补足信任链
conflict 解决“不该装什么”,而 composer.lock 和签名解决“装的到底是不是它”:
-
composer.lock中的content-hash和每个包的dist.shasum是防篡改锚点,必须提交 Git,不能.gitignore - Composer 2.5+ 支持签名验证,需全局开启:
composer config -g security.signature-verification true - 运行
composer show --security确认是否生效;仅 Packagist.org 上作者主动签名的包受保护 - 私有源(如 Satis)必须自行配置
signing-key,否则签名验证形同虚设
真正可靠的拦截不是靠某一个开关,而是 conflict 在解析层掐断、lock 文件锁定具体产物、签名验证确认来源真实——三者缺一不可。漏掉任意一环,攻击者就可能用 commit hash 替换、镜像缓存污染或伪造元数据绕过去。

















