应通过环境变量或 .env 文件动态注入敏感信息,禁止硬编码;使用 vlucas/phpdotenv 加载配置并忽略 .env;CI/CD 中通过 secrets 注入,避免日志泄露;生产环境需限制文件权限并定期轮换密钥。

不要把API密钥、数据库密码等敏感信息直接写在 composer.json 的脚本里,也不建议硬编码进 PHP 脚本或提交到 Git 仓库。安全的核心是:分离配置与代码、运行时注入、避免明文暴露。
使用环境变量动态注入
Composer 脚本支持读取环境变量,这是最常用且推荐的方式。在 composer.json 中用 ${ENV_VAR_NAME} 占位,运行时由系统或部署工具提供值。
- 脚本定义示例:
"scripts": { "deploy:api": "php deploy.php --key=${API_KEY}" } - 本地运行前设置:
export API_KEY="sk_live_abc123"; composer run deploy:api - CI/CD 中(如 GitHub Actions)通过 secrets 注入,不显示在日志中
借助 .env 文件配合库加载
如果脚本逻辑较重(比如调用外部 API),建议用专用 PHP 脚本 + vlucas/phpdotenv 加载配置,而不是全靠 Composer 解析变量。
- 安装 dotenv:
composer require vlucas/phpdotenv - 在
deploy.php开头加载:$dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load(); - 然后用
$_ENV['API_KEY']或getenv('API_KEY')获取,.env加入.gitignore
避免常见陷阱
有些做法看似方便,实则风险明显:
- 别在
composer.json里写"--key=sk_test_..."—— 会随仓库泄露 - 别用
exec("echo $API_KEY")类方式在脚本中打印密钥 —— 可能被日志捕获 - CI 环境中禁用
COMPOSER_VERBOSE=1或类似调试模式,防止变量值回显 - 敏感命令(如数据库迁移、密钥轮换)建议单独封装、限制执行权限,不放入常规
composer install流程
生产环境额外加固
上线后还需考虑运行上下文的安全性:
- Web 服务器用户(如 www-data)不应有读取
.env或环境变量配置文件的权限 - 容器部署时,用 Docker
--env-file或 KubernetesSecret挂载,而非构建镜像时写入 - 定期轮换密钥,并审计哪些脚本/服务仍在使用旧密钥










