必须同时禁用MySQL的SHOW DATABASES权限并配置phpMyAdmin的hide_db正则过滤;仅撤权限仍可通过INFORMATION_SCHEMA.SCHEMATA查询或USE报错暴露库名,而hide_db仅控制导航树渲染,不改变实际权限。

必须同时做两件事:关 MySQL 层的 SHOW DATABASES 权限 + 配 phpMyAdmin 的 hide_db 正则过滤。只做一边,用户仍能看到系统库或业务库列表。
为什么单靠 MySQL 权限不够
MySQL 的 SHOW DATABASES 权限控制的是执行该命令时返回哪些库名,但它不阻止用户通过其他方式“感知”库存在。比如:
- 用户执行
USE hidden_db会直接报错Access denied for user ... to database 'hidden_db',等于暴露了库名 - 查询
INFORMATION_SCHEMA.SCHEMATA仍能列出所有库(该行为不受SHOW DATABASES权限约束) - phpMyAdmin 在加载导航树时,若后端未过滤,仍可能把系统库传给前端渲染
所以仅 REVOKE SHOW DATABASES ON *.* 后,用户执行 SHOW DATABASES 确实只看到自己有权限的库,但 phpMyAdmin 默认仍会尝试拉取完整列表——除非你额外配置 UI 过滤。
怎么在 phpMyAdmin 配置里隐藏系统库
编辑 phpMyAdmin 根目录下的 config.inc.php,在对应 $cfg['Servers'][$i] 区块内添加:
$cfg['Servers'][$i]['hide_db'] = '^(information_schema|mysql|performance_schema|sys)$';
注意以下三点:
- 必须写在
$cfg['Servers'][$i]的大括号范围内,写在外面无效 - 正则必须用
^和$锚定全名,否则可能误匹配如my_mysql_backup - 改完需重启 Web 服务(Apache/Nginx/PHP-FPM),不是刷新页面就能生效
怎么撤销用户的 SHOW DATABASES 权限
用 root 或高权限账号登录 MySQL,执行:
REVOKE SHOW DATABASES ON *.* FROM 'username'@'host';<br>FLUSH PRIVILEGES;
关键点:
-
ON *.*必须写全,漏掉会失败 - 检查是否生效:
SELECT User, Host, Show_db_priv FROM mysql.user WHERE User = 'username';,结果应为N - 如果用户是
'username'@'%',但你操作的是'username'@'localhost',权限不会被撤回
隐藏后仍能在 SQL 窗口查到系统库,正常吗
完全正常。hide_db 只影响左侧导航树的显示逻辑,不改变连接用户的实际权限,也不拦截 SQL 请求。用户仍可手动执行:
SELECT schema_name FROM INFORMATION_SCHEMA.SCHEMATA;
或者 USE information_schema;(只要没被显式拒绝对该库的 USAGE 权限)。真正的“不可见”,只能靠应用层隔离(如连接时固定 database=xxx)+ 错误信息脱敏(避免把库名泄露在报错里)来逼近。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











