禁用 phpMyAdmin 空密码登录需同时设 $cfg['Servers'][$i]['AllowNoPassword'] 和 $cfg['Servers'][$i]['nopassword'] 为 false,清空或设非空 $cfg['Servers'][$i]['password'],并确保 MySQL 无空密码用户、禁用 skip-grant-tables、启用密码策略,且修改 config.inc.php 后清除浏览器 Cookie 并重启 Web 服务。

phpMyAdmin 本身不控制 MySQL 是否接受空密码,它只决定自己是否允许用空密码去连接 MySQL。禁用空密码登录,关键在改对配置项、且确保 MySQL 侧也无空密码用户。
修改 $cfg['Servers'][$i]['AllowNoPassword'] 和 $cfg['Servers'][$i]['nopassword']
这两个布尔配置必须同时设为 false(默认值通常就是 false,但需确认):
-
$cfg['Servers'][$i]['AllowNoPassword'] = false;:禁止 phpMyAdmin 使用空密码发起连接 -
$cfg['Servers'][$i]['nopassword'] = false;:禁止 phpMyAdmin 在登录表单中显示“密码为空也可提交”的逻辑 - 若任一为
true,即使 MySQL 拒绝空密码,phpMyAdmin 仍会尝试发送空凭据,导致报错或行为异常 - 注意:
$i是服务器索引,常见于循环配置中;若只配一个服务器,$i通常为1或0,需结合上下文确认
检查并清空 $cfg['Servers'][$i]['password']
这个字段是 phpMyAdmin 连接 MySQL 时使用的硬编码密码。如果它被设为空字符串 '',而 AllowNoPassword 又为 true,就会触发空密码连接——所以禁用空密码前必须清理它:
- 删掉或注释掉类似
$cfg['Servers'][$i]['password'] = '';的行 - 或者显式设为非空值,例如
$cfg['Servers'][$i]['password'] = 'your_real_password'; - 若该字段不存在,phpMyAdmin 会走登录表单流程,此时
AllowNoPassword才真正起作用
MySQL 侧必须无空密码用户,否则形同虚设
phpMyAdmin 配置只是前端闸门,后端 MySQL 若存在空密码账户,攻击者仍可通过命令行、其他客户端直连绕过:
立即学习“PHP免费学习笔记(深入)”;
- 登录 MySQL 后执行:
SELECT user, host, authentication_string FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL; - 对返回的每一行,执行:
ALTER USER 'user'@'host' IDENTIFIED BY 'strong_password';或DROP USER 'user'@'host'; - 务必禁用
skip-grant-tables:检查my.cnf或启动参数中是否含该选项,有则删除并重启 mysqld - 启用密码策略插件:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';+SET GLOBAL validate_password.policy = MEDIUM;,防止后续误设空密码
最容易被忽略的是:改完 phpMyAdmin 配置后没清浏览器 Cookie 或没重启 Web 服务,导致旧会话缓存仍在生效;另外,config.default.php 被修改后,若实际加载的是 config.inc.php,那改前者完全无效。



















