current_user() 返回 @localhost 或 @127.0.0.1 说明匿名用户(user = '')仍存在,需用 drop user ''@'localhost' 等逐条删除并执行 flush privileges,再手动清理 mysql.db 中 user = '' 的残留记录。

CURRENT_USER() 返回 @localhost 或 @127.0.0.1,说明匿名用户还在生效——这不是配置没改,而是根本没删干净。
先确认有没有匿名用户,别凭感觉删
匿名用户是 User = ''(空字符串),不是 NULL、不是 'anonymous'、也不是带空格的 ' '。在 phpMyAdmin 的「SQL」标签页里执行:
SELECT User, Host FROM mysql.user WHERE User = '';
常见结果包括:''@'localhost'、''@'127.0.0.1'、''@'::1'。如果返回空结果,直接跳过后续操作。
- skip-name-resolve 开启时,这三者互不等价,必须逐个处理
- 别只查
localhost就以为万事大吉,IPv4 和 IPv6 地址都得覆盖 - phpMyAdmin 界面「用户账户」列表默认不显示空用户名,靠它会漏判
用 DROP USER 逐条删除,别碰 DELETE FROM mysql.user
MySQL 5.7+ 不允许用 DELETE FROM mysql.user WHERE User = '' 清理匿名用户——它会报错或留下权限残留,且 FLUSH PRIVILEGES 也无法修复。必须用 DROP USER:
DROP USER ''@'localhost';<br>DROP USER ''@'127.0.0.1';<br>DROP USER ''@'::1';<br>FLUSH PRIVILEGES;
-
DROP USER会同步清理mysql.db、mysql.tables_priv等关联权限记录 -
DELETE只动主表,mysql.db中User = ''的行仍存在,攻击者仍可访问test库 - MySQL 8.0+ 启动时校验
mysql.user结构,强行删空行可能导致服务无法启动
删完必须验证,否则等于没做
仅看「用户账户」列表清空了没用。要分两步验证:
- 查表确认:再次执行
SELECT User, Host FROM mysql.user WHERE User = '';,必须返回空集 - 实连验证身份:在终端运行
mysql -u root -p -e "SELECT USER(), CURRENT_USER();",若CURRENT_USER()是@localhost,说明仍有匿名用户匹配成功(或root@localhost被覆盖) - 注意:phpMyAdmin 自身连接可能缓存旧权限,验证务必用命令行新连接
别把 auth_socket 当成匿名用户误删
Ubuntu 等系统默认给 root@localhost 配了 auth_socket 插件,它不校验密码、只认系统用户,看起来像“免密登录”,但不是匿名用户。确认方式:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'root' AND Host = 'localhost';
- 如果是
auth_socket,想统一用密码登录,执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';,再FLUSH PRIVILEGES - 真正要删的是那些既没用户名、又没明确用途的
''@xxx记录;但删之前得确认老监控脚本是否硬编码了mysql -u "" -h localhost这种调用
mysql.db 表里残留的空 User 条目不会自动清理,FLUSH PRIVILEGES 也不管它,得手动补一句 DELETE FROM mysql.db WHERE User = '';,否则 test 库还是开着门的。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











