phpmyadmin本身不存储数据库账号密码,泄露源于配置不当;必须禁用config认证模式,改用cookie或http模式,并确保config.inc.php不在web可访问路径、权限为600或640,同时设置$cfg['allowarbitraryserver'] = false。
phpmyadmin 本身不存储数据库账号密码——它只读取并使用你配置在 config.inc.php 里的凭证。所以“泄露”不是 phpmyadmin 主动外泄,而是配置不当导致凭证被攻击者读取或利用。关键在于:别让密码出现在可被 web 直接访问的文件里,也别让 phpmyadmin 把它暴露给前端或日志。
确认 auth_type 不是 config
这是最常见、最危险的配置错误。如果 $cfg['Servers'][$i]['auth_type'] = 'config',意味着用户名和密码明文写在 config.inc.php 中,一旦 Web 服务器出问题(比如 PHP 解析失效,返回 .php 源码),密码立刻裸奔。
- 必须改为
'cookie'或'http':登录时走 session 或 HTTP Basic Auth,凭证由用户每次输入,不硬编码 - 检查
config.inc.php里是否还残留$cfg['Servers'][$i]['user']和$cfg['Servers'][$i]['password']—— 如果用了cookie模式,这两行应该删掉或注释掉 - 验证方式:用浏览器访问
config.inc.php路径(如/phpmyadmin/config.inc.php),如果能看到明文密码,立刻整改
限制 config.inc.php 的文件权限和位置
即使用了 cookie 认证,config.inc.php 里仍可能含 $cfg['blowfish_secret'] 等敏感值,且文件本身若被读取,可能暴露其他配置逻辑。
- 文件权限设为
600(仅 owner 可读写)或640(owner + group 可读),绝不能是644或更宽松 - 确保该文件不在 Web 根目录下(如 Apache 的
DocumentRoot);理想位置是 Web 目录之外,比如/etc/phpmyadmin/config.inc.php - 在 Web 服务器配置中显式禁止访问所有
.inc.php文件:location ~ \.inc\.php$ { deny all; }(Nginx)或对应 Apache 的FilesMatch规则
禁用 AllowArbitraryServer 防 URL 注入凭据
当 $cfg['AllowArbitraryServer'] = true(4.x 默认开启),攻击者可通过构造 URL 如 ?server=evil.com&username=root&password=123 绕过登录,直接连接任意 MySQL 实例——等于把你的 phpMyAdmin 变成代理,帮别人连库。
- 5.x 默认已设为
false,但升级后常被忽略;务必确认配置中显式写了$cfg['AllowArbitraryServer'] = false; - 该选项一旦开启,
cookie或http认证形同虚设,因为认证流程根本没走到数据库连接环节 - 配合 Nginx/Apache 的请求参数过滤(如拦截
server=、username=)作为第二道防线
避免日志和错误信息泄露凭证
PHP 错误日志、Web 服务器访问日志、甚至 phpMyAdmin 自身的调试输出,都可能意外记录带凭证的 SQL 或请求参数。
- 生产环境关闭 PHP 错误显示:
display_errors = Off,同时设log_errors = On并确保日志路径不可 Web 访问 - 检查 phpMyAdmin 是否启用了调试模式:
$cfg['Debug'] = false;(默认就是 false,但有人会手动开) - MySQL 层面:禁用
general_log和slow_query_log,或确保其日志文件权限为600且路径非 Web 可达 - 特别注意:不要在 SQL 查询中拼接密码字段(比如
SELECT * FROM users WHERE password = 'xxx'),这类语句可能进慢查询日志
真正难防的不是技术细节,而是“以为关了就安全了”的错觉——比如改了 auth_type 却忘了删掉配置里的 password 字段,或者设了 AllowArbitraryServer = false 却没重启 Web 服务。每一步都得验证,而不是写完就跑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











