空密码账户需同时检查 authentication_string 和 Password 字段,并排查 plugin 为 auth_socket/unix_socket 的本地免密账户,确认用途后再设密或删除。

直接查 mysql.user 表的 authentication_string 和 Password 字段
PHP 5.7+ 默认用 authentication_string 存密码,老版本(5.6 及更早)用 Password 字段。空密码账户在这两个字段中至少有一个是空字符串或 NULL,不能只看一个。
在 phpMyAdmin 的 SQL 标签页执行:
SELECT User, Host, authentication_string, Password FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL OR Password = '' OR Password IS NULL;
注意:该查询需有访问 mysql 系统库权限,普通用户可能看不到结果——这是正常现象,说明你没被授权查看敏感系统表。
别漏掉 plugin 为 auth_socket 或 unix_socket 的账户
这类账户不依赖密码字段,而是靠系统用户身份认证。如果 plugin 是 auth_socket 且 Host 是 localhost,它可能绕过密码检查直接登录,等效于“无密码可用”。
立即学习“PHP免费学习笔记(深入)”;
补充检查语句:
SELECT User, Host, plugin
FROM mysql.user
WHERE plugin IN ('auth_socket', 'unix_socket') AND Host = 'localhost';-
auth_socket常见于 Ubuntu/Debian 的 MySQL 包,默认给root@localhost配置,本地终端用sudo mysql就能进——对远程或应用连接来说不算空密码,但本地提权风险高 - 若业务应用明确需要密码登录(比如 PHP 连接),这类账户必须改用
mysql_native_password插件并设强密码
执行前确认你有 SELECT 权限,且没被 sql_mode=STRICT_TRANS_TABLES 拦截
phpMyAdmin 默认以当前登录用户身份执行 SQL,如果该用户没被授 SELECT 权限到 mysql.user,会报错:#1142 - SELECT command denied to user ... for table 'user'。这不是语法问题,是权限不足。
常见应对方式:
- 用
root或具备SELECT ON mysql.*权限的账号登录 phpMyAdmin - 某些托管环境(如 cPanel)禁用了对
mysql库的直接访问,此时只能通过命令行或联系管理员 - 如果执行时报
Unknown column 'Password' in 'field list',说明是 MySQL 5.7+,删掉查询里所有Password相关条件即可
查出来之后别只删,先确认用途再操作
空密码账户未必都是恶意创建的,有些是初始化遗留、测试账户或特定集成组件(如某些旧版 CMS 安装脚本)自动创建的。直接 DROP USER 可能导致服务中断。
稳妥做法:
- 对每个可疑账户,先用
SHOW GRANTS FOR 'username'@'host';查权限范围 - 若权限极小(如只对某个测试库有
USAGE),可直接DROP USER - 若权限较大或不确定用途,先用
ALTER USER 'u'@'h' IDENTIFIED BY 'strong_pwd';强制设密,观察 24 小时是否影响业务 -
root@localhost出现在结果里?大概率是auth_socket类型,别急着删,先改插件和密码
真正危险的不是“有没有空密码”,而是“谁能在什么条件下用它登录”。字段为空只是表象,plugin + Host + 实际登录路径组合起来才决定风险等级。



















