敏感配置严禁硬编码在config/database.php中,否则会随Git提交导致泄露;必须通过.env文件定义DB_PASSWORD等变量,并在database.php中显式调用env('DB_PASSWORD')读取,同时严格禁止Web访问.config/目录及.env文件。

敏感配置硬编码在config/database.php会直接进Git仓库
很多人把DB_PASSWORD、APP_KEY这类值直接写进config/database.php或config/app.php,结果上线后被扫库工具抓取,数据库瞬间失守。ThinkPHP 6+ 默认启用 dotenv 支持,但框架不会自动把.env内容塞进配置——你得手动在配置文件里调用env('DB_PASSWORD'),否则.env形同虚设。
-
.env必须放在项目根目录(和public/同级),且 Web 服务器禁止对其直接访问 - 环境变量名必须全大写+下划线,比如
DB_HOST,不能写成db_host或db-host -
env()函数只在配置文件中有效;在控制器或中间件里用$_ENV['DB_HOST']大概率是undefined index - 本地开发时
env('DB_PASSWORD', 'root')的默认值仅作兜底,上线后必须删掉第二参数,否则密码可能意外暴露
config目录下的PHP文件会被缓存并覆盖,.env才是唯一可信来源
ThinkPHP 启动时会把所有config/*.php合并后写入runtime/config.php。一旦开启配置缓存(app.app_debug = false时默认开启),后续修改config/database.php根本不会生效——因为框架读的是缓存文件。而.env只在初始化早期读一次,它不进缓存,也不受config:clear影响,是部署时唯一能动态切换的入口。
- 改了
.env但数据库连不上?先检查runtime/config.php里对应键是否已更新 - 服务器上
php-fpm用户若无权读.env(比如权限是600但属主不是www-data),env()返回null,连接直接失败 -
runtime/目录必须可写,否则缓存写不进去,CPU 可能飙升——这不是配置问题,是权限问题
Web服务器能直接下载config/*.php,只要没拦住就等于裸奔
Apache 或 Nginx 若未显式禁止,访问http://yoursite.com/config/database.php会原样输出明文密码。这不是“理论上可能”,而是真实发生过的高频漏洞。单纯靠chmod 644或加<?php exit; ?>毫无意义——如果 PHP 解析器没触发,文件就当纯文本返回。
- 最可靠做法:把
config/目录移出 Web 根目录,比如放到/var/www/myapp/config/,而 Web root 是/var/www/myapp/public/ - Nginx 必须加
location ~* \.(env|config|ini)$ { deny all; },注意用~*而非^~,否则正则规则可能被通用 rewrite 覆盖 - Apache 的
.htaccess要放在项目根目录(不是public/),且AllowOverride All必须在虚拟主机配置中启用 -
application/、runtime/、common/这些目录同样要一并禁止访问,它们也存着敏感信息
多环境部署时config/*.php无法安全复用
测试环境和生产环境的数据库地址、Redis 密码、第三方 API Key 绝对不能共用一个config/database.php。ThinkPHP 6+ 的环境配置机制要求你按APP_ENV值加载config/{env}/database.php,但这个机制只对 PHP 文件生效,.env才是跨环境一致的注入源。
立即学习“PHP免费学习笔记(深入)”;
- 别把
config/prod.php当成环境配置文件——它不存在;正确路径是config/production/database.php - 环境目录名必须和
.env中APP_ENV=production的值完全一致(区分大小写) - 环境配置不是叠加,而是合并:同名字符串键会被覆盖,数字键会追加——如果你在
config/production/database.php里漏写了'prefix',它会继承config/database.php里的值,这未必是你想要的 - CI/CD 流水线往服务器写
.env比替换整个config/目录更安全、更原子
真正危险的不是“不知道怎么藏”,而是把敏感项留在config/目录下还觉得加了exit;就万事大吉。路径隔离 + 环境变量注入 + Web 层拦截,三者缺一不可。



















