composer install --no-scripts --no-plugins是唯一官方支持的禁用所有脚本及插件钩子的方式,可防止post-install-cmd等恶意执行,确保生产与CI环境安全。

composer install 时如何禁用所有脚本执行
默认情况下,composer install 会自动运行 post-install-cmd、pre-autoload-dump 等脚本钩子——这些脚本若来自不可信包,可能执行任意命令(如写入 webshell、调用 exec() 或 system())。生产环境或审计阶段必须关闭。
最直接有效的做法是加 --no-scripts 参数:
composer install --no-scripts --no-plugins
注意两个参数要同时使用:--no-scripts 关闭所有自定义脚本,--no-plugins 禁用插件(包括可能注入钩子的第三方插件)。CI/CD 流水线中应强制加入该组合,而非仅依赖 config.autoload-suffix 等间接控制。
常见错误现象:
- 部署后发现
public/下多出可疑 PHP 文件(脚本偷偷写入) -
composer install耗时异常长,且日志中出现Running script xxx(说明钩子仍在运行) - 安全扫描工具报出
eval()或shell_exec()调用路径,源头指向某个包的安装脚本
如何在 composer.json 中显式清空脚本钩子
仅靠命令行参数不够——开发人员仍可能本地漏掉 --no-scripts,或 CI 配置遗漏。应在项目级锁定行为,让脚本“不存在”。
在 composer.json 的 scripts 字段中,将所有钩子设为空数组:
"scripts": {
"post-install-cmd": [],
"post-update-cmd": [],
"pre-autoload-dump": [],
"post-autoload-dump": []
}
这样即使不加 --no-scripts,Composer 也不会执行任何逻辑(空数组不触发执行)。但要注意:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 某些框架(如 Laravel)依赖
post-autoload-dump生成优化类映射,清空后需手动补composer dump-autoload --optimize - 不要用
null或false替代空数组,Composer 会忽略无效值并回退到默认行为 - 如果项目确实需要某一个钩子(如生成前端资源),只保留那一个,并严格审查其源码是否含动态函数调用
为什么 --prefer-dist 比 --prefer-source 更安全
--prefer-dist 强制 Composer 从压缩包(zip/tar)安装,而非克隆 Git 仓库;这能规避两类风险:源码分支被篡改、安装脚本被恶意重写。
原因很实际:
- 压缩包由 Packagist 在发布时生成并签名,内容固定;而
--prefer-source会拉取当前HEAD,若作者仓库被黑,新提交可能已植入后门 - Git 仓库中的
composer.json可能包含未在 Packagist 上发布的实验性脚本(如post-root-package-install),dist 包则只含经审核的稳定配置 - 某些恶意包专为
--prefer-source设计:在.git/hooks/或composer.json中埋藏条件触发逻辑,dist 模式下完全失效
建议在所有自动化流程中显式声明:
composer install --prefer-dist --no-scripts --no-plugins
敏感项目中如何隔离 require-dev 的脚本权限
require-dev 里的包(如 phpunit/phpunit、roave/security-advisories)虽不进生产环境,但其脚本在本地 composer install 时仍会执行——而它们往往权限更高(比如调用 git、phpstan 扫描全项目)。
正确做法是分环境安装:
- 开发机:照常装
require-dev,但加--no-plugins防插件越权 - CI 测试阶段:用
composer install --no-scripts --no-plugins --no-dev(测试环境也不该执行 dev 脚本) - 生产部署:严格使用
composer install --no-scripts --no-plugins --no-dev --optimize-autoloader
容易被忽略的一点:roave/security-advisories 是个“冲突包”,它本身不提供功能,而是通过 conflict 规则阻止不安全版本安装——但它不需要运行任何脚本,所以即便禁用脚本也完全不影响防护效果。

















