先确认有没有匿名用户,别白忙活
很多人一上来就删
DROP USER ''@'localhost',结果报错
ERROR 1396 (HY000)——因为压根没这个用户。MySQL 里的“匿名用户”特指
User = ''(空字符串),不是
NULL,也不是
'anonymous'。执行这句就能准确定位:
SELECT User, Host FROM mysql.user WHERE User = '';
如果返回空结果,说明没有匿名用户,后续所有删除操作都可跳过。尤其 MySQL 8.0+ 默认安装已跳过创建匿名用户这步;你要是离线安装、或从 5.6 升级上来的,才更可能遇到。
删法要看 MySQL 版本,乱用会失败
MySQL 5.7+ 必须用
DROP USER,不能只
DELETE FROM mysql.user;而 MySQL 5.6 及更早版本不支持
DROP USER ''@'host'(语法报错),只能走表删法。实操建议如下: MySQL 5.7 及以上(推荐):
DROP USER ''@'localhost';<br>DROP USER ''@'127.0.0.1';<br>DROP USER ''@'::1';<br>FLUSH PRIVILEGES;MySQL 5.6 或更低(兼容兜底):
DELETE FROM mysql.user WHERE User = '';<br>FLUSH PRIVILEGES;注意:只删表不
FLUSH PRIVILEGES,权限缓存不会更新,删了也白删——你立刻
mysql -u '' -h localhost还能连进去。
删完必须验证,否则等于没做
删完不是就结束了。得双重验证:
查表确认:SELECT User, Host FROM mysql.user WHERE User = '';必须返回空集; 实连测试:
mysql -u '' -h 127.0.0.1 -P3306应该直接报错
Access denied; 顺手检查 root 是否空密码:
SELECT User, Host, authentication_string FROM mysql.user WHERE User = 'root';若
authentication_string是空或
*(MySQL 5.7),说明真正的问题是 root 没设密码——这才是多数人误以为“匿名登录成功”的真实原因。
配套动作不能少,否则禁用只是假象
禁用匿名用户只是安全加固的第一步。常见疏漏包括:
bind-address = 0.0.0.0或配置被注释掉,导致 MySQL 监听公网,哪怕没匿名用户,攻击者也能爆破其他账号; 留着
root@
'%'且密码弱,比匿名用户还危险; 没运行
mysql_secure_installation,它能自动处理匿名用户、test 库、远程 root 等一揽子问题; 应用仍用
root连接,一旦泄露就是全库沦陷——应为每个服务建专用用户,如
CREATE USER 'app1'@'localhost' IDENTIFIED BY 'xxx';,再按需授权。
最常被忽略的其实是验证环节:删完不测连接、不查 user 表、不看
bind-address,等于在门上贴张“禁止入内”纸条,却把钥匙留在门把手上。
