必须分层堵漏:禁用未审核插件(设 "*": false)、锁定来源(仅用 packagist.org)、禁用自定义仓库、用精确版本、普通用户运行 install。

直接结论:光靠“不手误”或“信官方源”远远不够,Composer 安装恶意包的风险来自多个可执行环节——依赖源、插件、安装脚本、权限、版本模糊性。必须分层堵漏,缺一不可。
怎么禁用未经审核的 Composer 插件?
Composer 2.2+ 默认禁止所有插件自动运行,但很多人没配白名单,导致首次 install 时盲目确认,或干脆退回到旧版行为。
- 检查
composer.json中是否有"allow-plugins"配置;没有就立刻加,例如:{ "config": { "allow-plugins": { "composer/installers": true, "phpstan/extension-installer": true, "*": false } } } -
"*": false是关键——它关掉所有未显式授权的插件,包括那些名字带hook、installer、deploy的可疑包 - 别用
composer config --global allow-plugins true全局放开,这等于卸掉刹车 - 如果项目真需要某个插件(比如
ocramius/package-versions),必须写全名 +true,不能靠"ocramius/*": true这种通配
为什么 composer.lock 提交了还中招?
因为 composer.lock 只锁版本和哈希,不锁来源和执行逻辑。攻击者只要控制了包作者账号或 Packagist 元数据,就能在不改版本号的前提下,把 dist.url 指向恶意 ZIP,或往 scripts 里塞 post-install-cmd。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 生产环境部署必须加
--no-dev --prefer-dist:前者跳过开发依赖(常含高危插件),后者强制走压缩包而非源码,绕过post-install-cmd执行 - 每次
composer install前先跑composer validate --strict,它会报出scripts字段缺失、autoload异常等可疑信号 - 用
composer show vendor/package --all查看元数据,重点核对dist.url是否为 packagist.org 域名,dist.shasum是否非空 - CI 流程中加
composer audit --format=json | jq '.advisories | length',让漏洞数 >0 时直接失败
如何确保只从 packagist.org 装包?
自定义 repositories 是最大后门。哪怕你只加了一行 {"type":"composer","url":"https://mirror.example.com"},Composer 就不再校验该包是否在 packagist.org 注册过,攻击者可伪造同名包投毒。
- 删掉
composer.json里的repositories字段,一个不留;若必须用私有源,走企业级方案(如 Private Packagist 带人工审核) - 运行
composer config --global repo.packagist false彻底禁用全局源,再手动加回官方源:composer config --global repo.packagist '{"type": "composer", "url": "https://packagist.org"}' - 检查环境变量:
echo $COMPOSER_REPO_PACKAGIST,非空就unset COMPOSER_REPO_PACKAGIST - 设
secure-http=true(默认已开),并确认没设disable-tls=true—— 后者会让 HTTPS 校验失效,中间人可篡改元数据
哪些版本写法实际等于“开放攻击面”?
^2.0 和 ~2.0.0 看似稳妥,实则允许升到 2.9.9,而 CVE 可能藏在 2.8.1 里。Composer 不会主动避开带漏洞的小版本,除非你开了 audit.block-insecure。
- 核心组件(如
symfony/http-kernel、laravel/framework)必须用精确版本:"symfony/http-kernel": "6.4.12" - 禁用
dev-master和dev-main:它们绕过版本锁定,且可能指向未审核的提交 - 运行
composer config audit.block-insecure true(Composer 2.9+ 默认开启),让composer update遇到已知漏洞时直接中断 - 别信
"minimum-stability": "stable"—— 它只管标签,不管 CVE;真正起作用的是audit和lock的组合
最易被忽略的一点:composer install 在 root 下运行时,恶意包的 post-install-cmd 脚本能直接写入 /etc/crontab 或覆盖 /usr/local/bin。永远用普通用户执行,哪怕只是临时 sudo -u deploy composer install。










