--no-scripts 仅跳过执行 composer.json 中的 scripts 钩子,不解决脚本安全性问题;真正安全需依赖可信来源、环境管控、allow-plugins 白名单及资源限制等综合措施。

--no-scripts 会跳过 composer.json 中定义的所有 scripts,包括 post-install-cmd、pre-update-cmd 等钩子,但它**不解决脚本本身是否安全的问题**——它只是绕过执行。真正影响安全的是脚本来源是否可信、是否被篡改、是否运行在受控环境中。
哪些场景必须加 --no-scripts
当你要确保 composer 操作「只做依赖管理,不做任何额外动作」时才需要它。典型情况:
- CI/CD 流水线中执行
composer install --no-interaction --no-scripts,避免因脚本调用外部命令或写文件导致构建失败或泄露 - 审计阶段检查依赖树,防止自定义脚本干扰
composer show或composer why的输出 - 在不可信的 fork 仓库上运行
composer update前,先用--no-scripts确认依赖变更范围,再决定是否允许执行钩子
--no-scripts 不等于“防恶意脚本”
它只是跳过执行,但不会校验脚本内容、不阻止脚本被写入 composer.json、也不影响 vendor/bin 下由包自带的可执行文件(比如 phpunit、larastan)。恶意行为仍可能发生在:
- 脚本本身是合法的,但通过环境变量注入恶意参数(如
"post-install-cmd": "sh -c 'eval $MALICIOUS'") - 脚本调用本地已存在的二进制(如
git、curl),而这些工具已被劫持 -
autoload-dev加载的测试类中包含隐蔽逻辑,在phpunit运行时触发
比 --no-scripts 更有效的安全控制点
真正提升 composer 运行安全性的做法,不是靠跳过脚本,而是限制脚本能做什么:
- 用
COMPOSER_ALLOW_SUPERUSER=0环境变量禁止以 root 执行脚本(默认已启用,但某些旧版本需显式设) - 设置
process-timeout=60和memory-limit=-1防止脚本耗尽资源(写在composer.json的config下或COMPOSER_PROCESS_TIMEOUT环境变量) - 使用
composer validate --strict检查composer.json是否含可疑命令(如exec、system、shell_exec字符串) - 在 CI 中用
composer install --no-dev --no-scripts+composer dump-autoload --classmap-authoritative组合,既禁用钩子又关闭动态加载,减少攻击面
{
"config": {
"process-timeout": 60,
"fxp-asset": {"enabled": false},
"allow-plugins": {
"phpstan/extension-installer": true,
"dealerdirect/phpcodesniffer-composer-installer": true
}
},
"scripts": {
"post-install-cmd": [
"@php vendor/bin/php-cs-fixer fix --dry-run"
]
}
}
注意:allow-plugins 是 Composer 2.2+ 引入的关键安全机制,它替代了全局插件白名单,必须显式声明允许哪些插件——这点比 --no-scripts 对供应链安全的影响大得多。










