必须彻底删除mysql.user表中的root@'%'等非localhost远程用户,并清除phpMyAdmin配置中硬编码的root凭据及AllowRoot=true设置,同时在Apache/Nginx层严格限制访问IP,三者缺一不可。

生产环境禁止 phpMyAdmin 用 root 直接登录,不是“怕输错密码”,而是因为 root 账号一旦被攻破或误配,等于把数据库的完全控制权直接交到 Web 层——而 Web 层本就是最常暴露、最易被利用的攻击面。
root@'%' 用户存在即高危
MySQL 的 root@'%' 是远程登录的实体凭证,不是配置开关。只要它在 mysql.user 表里存在,攻击者拿到 phpMyAdmin 访问入口 + 任意一种漏洞(XSS、CSRF、弱口令、未授权访问),就能直连数据库执行任意命令。删掉它比改任何配置都管用:DROP USER 'root'@'%'; FLUSH PRIVILEGES;。别信“我绑定了 bind_address=127.0.0.1 就安全”——phpMyAdmin 本身是 PHP 应用,它连自己本机 MySQL 时走的是 TCP 或 socket,不经过网络层过滤。
phpMyAdmin 配置可能绕过 MySQL 层限制
即使 MySQL 已删 root@'%',config.inc.php 里仍可能硬编码 $cfg['Servers'][$i]['user'] = 'root'; 和密码,或设 $cfg['Servers'][$i]['AllowRoot'] = true;。这种配置会让 phpMyAdmin 主动尝试用 root 连接,哪怕你只输入普通账号,它也可能在后台悄悄重试 root。必须检查并删除或注释掉这些行,强制用户手动输入非 root 账号。
localhost 和 127.0.0.1 权限不互通
MySQL 把 'root'@'localhost' 和 'root'@'127.0.0.1' 当作两个独立用户。很多部署脚本会自动创建后者,而你只删了前者,结果远程连接照常生效。查全用:SELECT User, Host FROM mysql.user WHERE User = 'root';。只要 Host 列出现 %、127.0.0.1、192.168.% 等非 localhost 值,就得逐个 DROP USER。
立即学习“PHP免费学习笔记(深入)”;
Apache/Nginx 层没锁死,前面所有操作都白做
phpMyAdmin 页面本身如果能被外网直接访问,那上面任何账号(包括你刚建的低权限账号)都可能被暴力破解或钓鱼窃取。必须在 Web 服务器配置里明确限制 IP:Require ip 10.0.0.0/8 或 Require ip 127.0.0.1,不能留 Require all granted。Docker 环境还要额外确认 PMA_HOST 指向的是服务名而非 127.0.0.1,否则容器内 localhost 会解析失败,反而触发 fallback 到不安全的连接逻辑。
真正难防的不是黑客,是部署时顺手写的那行 $cfg['Servers'][1]['user'] = 'root';,和忘记删的 root@'127.0.0.1' ——它们安静躺在配置里,直到某次更新、迁移或日志告警才被发现。



















