$cfg['Servers'][$i]['hide_db']不能跨服务器统一屏蔽,因其绑定于单个服务器实例内部,仅控制左侧导航树显示且不限制实际权限,需为每个服务器单独配置且重启Web服务才生效。

不能靠“隐藏”来保护敏感数据库实例——多服务器配置里没有全局数据库过滤机制,$cfg['Servers'][$i]['hide_db'] 只作用于单个服务器连接下的数据库列表,且必须为每个服务器单独配置。真要隔离敏感实例,得从连接层入手。
为什么 $cfg['Servers'][$i]['hide_db'] 不能跨服务器统一屏蔽?
这个配置项是绑定在每个 $cfg['Servers'][$i] 实例内部的,不是全局开关。你给 Server #1 加了 '^(mysql|sys)$',Server #2 的系统库照样显示,除非你也手动加一遍。更关键的是:它只影响左侧导航树渲染,不改变用户实际权限——如果该账号对 mysql.user 有 SELECT 权,照样能查、能导出、能在 SQL 窗口执行语句。
- 配置必须写在
$cfg['Servers'][$i]大括号内,写在外面无效 - 正则必须用
^和$锚定,否则可能误匹配如my_mysql_logs - 修改后需重启 PHP-FPM 或 Apache,浏览器硬刷(Ctrl+Shift+R)才刷新缓存
真正隔离敏感数据库实例的两种可靠方式
想让某个 MySQL 实例(比如生产库)完全不暴露在 phpMyAdmin 的服务器选择列表里,或者让它连登录都不出现,只有两个办法:
-
删掉对应服务器配置块:直接从
config.inc.php中移除那个$cfg['Servers'][2]的整个定义,它就彻底不会出现在登录下拉菜单中 -
改
auth_type为http并配合 Web 层权限控制:把敏感实例设为'auth_type' => 'http',再在 Nginx/Apache 中用allow/deny或 Basic Auth 限制访问来源,这样即使配置存在,没权限的人也进不去登录页
别试图用 $cfg['Servers'][$i]['hide_db'] 去“掩耳盗铃”——它不防 SQL 窗口,不防导出,也不防已登录用户切换数据库执行命令。
立即学习“PHP免费学习笔记(深入)”;
多服务器环境下误配 hide_db 的典型症状
常见错误不是配置写错,而是没意识到它只管“显示”,不管“访问”。现象包括:
- 左侧导航栏看不到
information_schema,但 SQL 窗口里USE information_schema;仍能执行成功 - 对 Server #1 配了
hide_db,结果 Server #2 的同名库还在列表里,用户手动输库名就能切过去 - 配置生效后,导入功能里仍能选中被隐藏的库——因为导入逻辑绕过导航树,直读 MySQL 的
SHOW DATABASES结果
最易被忽略的一点:phpMyAdmin 登录界面的服务器下拉列表,只取决于 $cfg['Servers'] 数组长度和 auth_type 是否允许展示,跟任何 hide_db 设置都无关。要让它“不存在”,就得让它“没定义”。



















