config.inc.php安全需三重保障:文件所有者必须为非Web用户(如phpmyadmin-admin),权限640且组为www-data;blowfish_secret须硬编码32位随机字符串;安装路径必须脱离Web根目录(如/usr/share/phpmyadmin/)并禁用符号链接。
config.inc.php 不是配完就能用的文件,它本身就是最大攻击面 —— 配错权限、留空关键字段、放错位置,等于把数据库密码本直接贴在服务器门口。
config.inc.php 文件权限和所有者必须严格分离
640 权限本身没毛病,但前提是 config.inc.php 所属用户不能是 www-data(或 apache、nginx)。否则 Web 进程能读,任意文件读取漏洞也能读,跟 644 没区别。
- 正确做法:用独立管理用户拥有该文件,比如
chown phpmyadmin-admin:www-data config.inc.php - 再执行
chmod 640 config.inc.php,确保组可读、其他不可读 - 验证 Web 进程是否真属于该组:
id -Gn www-data,输出里必须含www-data - 绝对禁止
chown www-data:www-data config.inc.php—— 这是最常见的“伪安全”操作
blowfish_secret 必须硬编码为 32 字节随机字符串
留空、用默认值、或长度不对(比如 16 字节),会导致登录页报错“配置文件现在需要绝密的短语密码”,或更糟:降级使用弱加密,Session 可被预测。
- 生成方式示例:
openssl rand -base64 32 | tr -d '\n' | tr -d '+' | cut -c1-32 - 必须写死在
config.inc.php中:$cfg['blowfish_secret'] = 'Zx9vKq2F...'; - 不能通过环境变量或 include 动态加载 —— phpMyAdmin 启动时就依赖它解密 cookie
- 如果用了
auth_type = 'cookie'却没设这个值,整个登录流程会失败
auth_type 选 cookie 而不是 config,且禁用空密码
auth_type = 'config' 把 MySQL 用户名密码明文写进配置文件,一旦泄露就是全线沦陷;而 auth_type = 'cookie' 把认证交给 Session,更可控也更安全。
- 必须设为
$cfg['Servers'][$i]['auth_type'] = 'cookie'; - 同时关闭空密码:
$cfg['Servers'][$i]['AllowNoPassword'] = false; - 不要用
http认证 —— Base64 编码不等于加密,没 HTTPS 就等于裸奔 - 如果必须免密登录(如内网调试),至少限制 IP 段,并配合 Nginx/Apache 的
allow/deny规则
phpMyAdmin 安装路径必须脱离 Web 根目录
把 phpMyAdmin 放进 /var/www/html/ 或 /htdocs/ 下,再靠 .htaccess 或 location 挡 config.inc.php,是典型“纸糊防线”。路径解析绕过、配置失误、模块未启用,都会让配置文件直接 HTTP 可访问。
立即学习“PHP免费学习笔记(深入)”;
- 标准位置应是系统级路径,如
/usr/share/phpmyadmin/(Debian/Ubuntu)或/opt/phpmyadmin/ - Nginx 中用
alias /usr/share/phpmyadmin/;(注意结尾斜杠),Apache 用Alias /phpmyadmin /usr/share/phpmyadmin -
<directory></directory>块中必须禁用FollowSymLinks和AllowOverride - 检查
config.inc.php是否可通过浏览器直接访问:访问https://yoursite.com/config.inc.php应返回 404 或 403,而非源码
最常被忽略的一点:即使所有配置都对了,只要 config.inc.php 在 Web 可达路径下、且 Web 进程是文件所有者,前面所有努力就归零。安全不是配参数,而是控上下文。



















