核心原则是密码不落地、凭据不硬编码、配置不暴露;必须通过环境变量(如.env文件)动态注入DB_PASSWORD,禁止明文写入配置文件,并在运行时立即unset敏感字段,结合最小权限与内网地址约束。

生产环境数据库配置的核心原则就一条:密码不落地、凭据不硬编码、配置不暴露。不是“尽量避免”,而是必须切断所有明文泄露路径。
敏感信息全走环境变量
别在config/database.php里写'password' => '123456'——这等于把数据库钥匙贴在服务器门口。正确做法是:
- 在项目根目录的
.env文件中只写:DB_PASSWORD=your_real_password
(注意:无引号、无空格、无注释) - 在
config/database.php中显式读取:'password' => getenv('DB_PASSWORD') ?: '' - 确保
.env不在 Web 可访问路径下(如 Nginx 的root之外),且已加入.gitignore
配置文件本身要“干净”
database.php不是填空题,而是安全过滤器:
- 删掉所有示例密码、测试账号,哪怕注释掉也不行;
- 只保留必要键名(
hostname、database、charset等),敏感字段全部由getenv()动态注入; - 若用 CI/CD 部署,可在流水线中加检查:
grep -q "password\|passwd" config/database.php && exit 1
连接建立后立即销毁凭据
尤其在 Swoole、Workerman 或长连接场景下,密码会常驻内存:
立即学习“PHP免费学习笔记(深入)”;
- 数据库配置数组加载后,立刻执行:
unset($config['password']); - 避免日志或调试工具(如 xdebug)意外 dump 出完整配置;
- ThinkPHP 6+ 中可在
think\db\connector\Mysql类初始化后做清理,或在自定义连接工厂中统一处理。
环境隔离与权限收束
配置安全不只是内容问题,更是运行时约束:
- 开发、测试、生产环境使用不同
.env文件(如.env.production),通过APP_ENV=production自动加载; - 数据库用户权限最小化:只授予目标库的
SELECT, INSERT, UPDATE, DELETE,禁用DROP、CREATE、FILE等高危权限; - 生产环境
DB_HOST必须用内网地址(如10.0.1.5),禁用localhost(MySQL 会走 socket,权限模型不同,易绕过网络层限制)。



















