最准最快方式是查authentication_string字段空值或'':mysql 5.7.6起password字段已弃用,8.0完全移除;authentication_string=''、=''或trim后长度为0均表示无密码,须三者并查且用trim防空格绕过。

直接查 mysql.user 表里的 authentication_string 字段,空值或特定占位符就代表无密码——这是最准、最快、不依赖版本猜测的方式。
为什么不能只看 password 字段?
MySQL 5.7.6 起已弃用 password 字段,8.0 完全移除;所有认证信息统一存进 authentication_string。继续查 password 会返回空结果,误判“没风险”。
-
authentication_string = '':显式设为空字符串,可免密登录 -
authentication_string = '*':旧版未加密占位符,等效空密码 -
LENGTH(TRIM(authentication_string)) = 0:防中间带空格的伪装(如' ')
执行检查的 SQL 必须包含这三类条件
单独用 = '' 或 IS NULL 都不完整。正确写法:
SELECT host, user, plugin, authentication_string
FROM mysql.user
WHERE LENGTH(TRIM(authentication_string)) = 0
OR authentication_string IN ('', '*');
- 必须用
TRIM(),否则空格绕过检测 - 必须包含
'*',尤其在从 5.6 升级上来的实例中常见 - 需以
root或具备SELECT ON mysql.*权限的账号执行
查到结果后别急着删,先确认 host 范围是否真危险
例如 'app_user'@'127.0.0.1' 是本地服务账号,'admin'@'%' 才是高危项。
- 重点盯:
host = '%'、host = '0.0.0.0'、user = ''(匿名用户) - 宽松网段如
'192.168.%'若暴露在公网,实际等同于'%' - 用
SHOW GRANTS FOR 'user'@'host';看真实权限,避免误删有用途的低权空口令账号
真正容易被忽略的是:有些账号虽 account_locked = 'Y',但 authentication_string 仍是空的——锁住不等于安全,重启或误操作可能解锁。只要字段值为无效认证串,就得处理。











