<p>必须撤销全局SHOW DATABASES权限才能隐藏数据库:执行REVOKE SHOW DATABASES ON . FROM 'user'@'host',再GRANT目标库权限并FLUSH PRIVILEGES,此后用户执行SHOW DATABASES仅见已授权库及系统库。</p>
不能靠 phpmyadmin 前端隐藏来实现,必须从 mysql 权限层切断 show databases 的可见性。 用户在登录后仍能看到所有数据库,说明权限没撤干净——这不是界面配置问题,而是 mysql 的 show databases 权限仍为开启状态。
为什么用户还能看到其他数据库?
MySQL 默认让所有可登录用户执行 SHOW DATABASES 并列出全部库名,哪怕他对其中 99% 的库没有任何操作权限。这和“能否访问”无关,只和 show_db_priv 字段有关。phpMyAdmin 的 $cfg['Servers'][$i]['hide_db'] 或 only_db 只在登录成功后起作用,对登录页的数据库列表完全无效。
- 检查实际生效权限:
SELECT Host,User,Show_db_priv FROM mysql.user WHERE User='target_user';—— 若Show_db_priv是Y,就必然看到全部库 -
CURRENT_USER()和USER()不同:权限校验只认前者,用错会导致误判 - 系统库(
information_schema、performance_schema、sys)始终可见,不受REVOKE影响
正确关闭“多余数据库”的三步操作
仅靠 GRANT 某个库的权限不够,必须显式收回全局 SHOW DATABASES 权限:
- 执行
REVOKE SHOW DATABASES ON *.* FROM 'target_user'@'host';—— 注意ON *.*不能省略,否则不生效 - 再执行
GRANT SELECT, INSERT ON `myapp_db`.* TO 'target_user'@'host';(按需补充其他权限) - 运行
FLUSH PRIVILEGES;确保立即生效(MySQL 8.0+ 多数情况可省,但加了更稳)
之后该用户执行 SHOW DATABASES,只会显示 myapp_db 和系统库;若知道其他库名并手动 USE other_db,仍会触发权限拒绝错误,不会越权。
常见配置陷阱
很多人以为改了 phpMyAdmin 的 $cfg['Servers'][$i]['only_db'] 就能控制登录页可见性,其实完全不是:
立即学习“PHP免费学习笔记(深入)”;
-
$cfg['Servers'][$i]['only_db']只影响登录后的数据库下拉列表,对SHOW DATABASES结果无任何干预 -
$cfg['Servers'][$i]['hide_db']是正则过滤,写错会误杀目标库(比如'^(mysql|sys)$'会把mysql_backup也干掉) - 若 phpMyAdmin 使用
auth_type => 'config',它根本不用你输的账号,而是用配置里固定的$cfg['Servers'][$i]['user']连接——此时你改的用户权限毫无意义
真正起效的永远是 MySQL 层的 show_db_priv 字段,不是 phpMyAdmin 的任何前端开关。漏掉 REVOKE SHOW DATABASES 这一步,其他所有操作都是障眼法。



















