存在匿名用户需执行select user, host from mysql.user where user = ''确认;删除须用drop user ''@'localhost'和drop user ''@'%';删后必须flush privileges刷新权限缓存,否则无效;还需检查并处理空密码用户。

如何确认是否存在匿名用户
MySQL 启动后默认可能创建 ''@'localhost' 或 ''@'%' 这类用户名为空的账户,它们能绕过密码验证直接登录。先连上 MySQL(用 root 或高权限账号),执行:
SELECT User, Host FROM mysql.user WHERE User = '';如果返回任意记录,说明存在匿名用户,必须处理。
删除匿名用户的正确命令
不能只删 User = '' 的行,必须同时指定 Host 值,否则会报错或删错。常见误操作是写成 DROP USER '' —— 这在 MySQL 8.0+ 会失败,因为语法要求必须带 host:
DROP USER ''@'localhost';<br>DROP USER ''@'%';注意:MySQL 5.7 及以前可用
DELETE FROM mysql.user WHERE User = ''; + FLUSH PRIVILEGES;,但不推荐,因权限表结构变动可能导致残留;优先用 DROP USER。为什么删完还要执行 FLUSH PRIVILEGES
MySQL 不会自动重载内存中的权限缓存。即使删了用户记录,已建立的连接或未刷新的线程仍可能凭旧缓存允许空用户登录。所以删完必须运行:
FLUSH PRIVILEGES;否则加固无效。这个步骤常被跳过,尤其在自动化脚本里漏掉,导致“明明删了却还能登”的问题。
检查是否还有空密码用户
匿名用户只是风险之一,空密码用户(authentication_string = '')同样危险。查法:
SELECT User, Host FROM mysql.user WHERE authentication_string = '' OR password_expired = 'Y' AND password_last_changed IS NULL;对结果中非系统账户(如
mysql.infoschema、mysql.session)要重置密码:ALTER USER 'username'@'host' IDENTIFIED BY 'strong_password';别忽略
@'%' 类主机,它比 @'localhost' 更危险——意味着任意远程 IP 都可无密登录。
实际加固时最容易被忽略的是:删完匿名用户后没验证新连接是否真的拒绝空用户登录,也没检查应用配置是否意外依赖了空用户——有些老旧部署脚本会硬编码 -u '' -p,删掉后应用直接连不上。










