敏感配置必须与代码解耦,推荐用 .env 文件 + vlucas/phpdotenv 加载 + 环境变量兜底;明文密码写入 config.php 易因误提交、缓存残留、Web Server 配置错误等导致泄露;phpdotenv 仅注入环境变量,不改全局状态,被 Laravel 等主流框架采用;.env 需设权限 600、加 .gitignore、配 .env.example;生产环境应优先使用系统级环境变量(如 Docker -e、K8s Secret);加密密钥需更高防护层级(如 Vault/KMS),且须支持双密钥轮换与日志审计。

敏感配置不能写死在代码里,必须和运行环境解耦。最直接有效的做法是:用 .env 文件存变量 + vlucas/phpdotenv 加载 + 环境变量兜底。
为什么不能把 DB_PASSWORD 写在 config.php 里
明文密码进 Git 就等于公开泄露;哪怕加了 .gitignore,开发机误提交、CI/CD 流水线缓存残留、Docker 构建上下文泄露,都可能让密码暴露。更危险的是,PHP 配置文件若因 Web Server 配置错误被当作静态文件返回,config.php 里的 'password' => '123456' 会直接裸奔到浏览器上。
常见错误现象:
- 部署后数据库连不上,查半天发现
config.php被服务器当文本返回,HTTP 状态码 200,内容全是明文凭据 - Git 历史里搜到
DB_PASS,且没轮换过密钥,攻击者可直接连生产库 - 测试环境和生产环境共用同一份配置文件,靠注释开关,上线时忘记切回,导致测试库被当生产库用
用 phpdotenv 加载 .env 是当前最稳妥的路径
它不依赖 Web Server 配置,不修改 PHP 全局状态,只做一件事:把 .env 里的键值对注入 $_ENV 和 getenv()。Laravel、Symfony 等主流框架默认采用,说明它经受住了大规模验证。
实操要点:
- 安装:
composer require vlucas/phpdotenv - 加载位置必须在所有业务逻辑之前(通常放在
index.php或入口引导文件顶部):require_once 'vendor/autoload.php'; $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
-
.env文件必须放在项目根目录,且权限设为600(chmod 600 .env),禁止组和其他用户读取 - 务必在
.gitignore中加入.env,并提供.env.example供协作参考
环境变量才是最终防线,.env 只是开发便利层
在容器或云平台部署时,.env 文件不可靠(易被覆盖、权限难控、多实例同步麻烦)。此时应绕过 .env,直接通过系统级环境变量注入,phpdotenv 会自动 fallback 到 getenv()。
这意味着你的配置读取逻辑要写成这样:
$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
$dbUser = getenv('DB_USER') ?: 'root';
$dbPass = (string) ($_SERVER['DB_PASSWORD'] ?? getenv('DB_PASSWORD'));
这样做有三个好处:
- Docker 启动时用
-e DB_PASSWORD=xxx即可生效,无需挂载文件 - Kubernetes 用 Secret 挂载环境变量,密钥不会落地磁盘
- 本地开发用
.env,生产用环境变量,逻辑一致,切换零成本
密钥管理不能止于“不硬编码”
很多人以为把密码挪到 .env 就安全了,但忽略了密钥本身也需要保护层级。比如加密用的 DATA_ENCRYPTION_KEY,如果只是个 32 字节随机字符串,存在 .env 里,和存在代码里区别不大——只要服务器被入侵,.env 和内存里的密钥都会被一起拿走。
真正关键的点在于:
- 加密密钥(如 AES 密钥)必须比数据库密码更高一级防护:优先走 HashiCorp Vault、AWS KMS 或 HSM,其次才考虑环境变量
- 数据库密码这类“连接凭据”,环境变量足够;但用于加解密用户身份证、银行卡的密钥,绝不能只靠
.env - 所有密钥加载逻辑必须加日志审计(谁、何时、从哪加载了哪个密钥),否则出问题时无法追溯
最常被忽略的是密钥轮换——没人真去换。一旦密钥长期不动,它就等同于写死在代码里。轮换不是改一个值就完事,得支持旧密钥解密 + 新密钥重加密的双密钥过渡期,这个逻辑必须提前设计进 DataEncryptor 类里,而不是等到审计要求才补。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











