mysql安装后默认存在test库及匿名用户,因历史遗留设计提供开箱即用测试环境;匿名用户(''@'localhost'、''@'%')无密码却默认拥有test库全部权限,构成严重安全风险。

test库为什么默认存在且自带匿名用户权限
MySQL安装后自动创建test库,不是功能必需,而是历史遗留的“开箱即用”测试环境。真正危险的是它常与匿名用户(''@'localhost'、''@'%')绑定——这些用户无密码、无用户名,却默认拥有对test库的USAGE和CREATE权限。只要网络可达 MySQL 端口(3306),攻击者就能连上并建表、写入恶意数据,甚至通过堆叠注入尝试提权。
如何确认当前是否存在匿名用户和test库
登录 MySQL 后执行两条命令即可快速验证:
-
SELECT User, Host FROM mysql.user WHERE User = '';—— 若返回任意行,说明存在匿名用户 -
SHOW DATABASES LIKE 'test';—— 若输出一行test,说明该库仍存在
注意:SHOW DATABASES; 会列出所有库,但test可能被隐藏(如启用了skip-show-database),所以必须用LIKE精确匹配。
安全删除test库和匿名用户的正确顺序
顺序错了就可能删不干净或引发权限残留:
- 先删库:
DROP DATABASE IF EXISTS test;—— 避免库不存在时报错,也防止后续脚本中断 - 再删用户:
DROP USER ''@'localhost'; DROP USER ''@'%';—— 必须分别指定 host,不能合并写成''@'localhost','%' - 最后刷新:
FLUSH PRIVILEGES;—— 否则旧权限缓存仍在,新连接仍可能生效
如果删用户时报错 ERROR 1396 (HY000),说明该用户实际不存在,跳过即可;但FLUSH PRIVILEGES仍需执行,确保状态一致。
删完之后最容易被忽略的三个点
很多人以为执行完上面三步就结束了,但真实环境中常因以下疏漏导致风险回弹:
- 未检查应用配置:某些老项目硬编码了
test作为默认数据库名,删库后应用启动报Unknown database 'test',运维可能顺手重建,又把漏洞带回来 - 未清理残留权限记录:即使
test库已删,mysql.db表里仍可能存有Db='test'的授权行,需手动清理:DELETE FROM mysql.db WHERE Db = 'test'; FLUSH PRIVILEGES; - 未审计其他测试库:除
test外,常见还有test_db、demo、tmp等命名变体,建议用SHOW DATABASES LIKE '%test%';和SHOW DATABASES LIKE '%demo%';一并排查











