phpmyadmin 默认显示系统库是因mysql权限模型允许用户访问,可通过配置$cfg['servers'][$i]['hide_db']正则隐藏,但需配合严格权限控制才能真正保障安全。

为什么 phpMyAdmin 会默认显示 mysql、information_schema 等系统库?
phpMyAdmin 默认连接后展示所有用户有权限访问的数据库,包括 mysql、information_schema、performance_schema、sys。这不是 bug,而是 MySQL 权限模型决定的:只要用户对这些库有 SELECT(哪怕只是 USAGE)权限,phpMyAdmin 就能列出它们。
但普通应用管理员通常不需要操作这些库,暴露它们反而增加误操作或信息泄露风险——比如看到 mysql.user 表结构可能诱发提权尝试。
用 $cfg['Servers'][$i]['hide_db'] 配置项过滤掉系统库
这是最直接、生效最快的方式,在 phpMyAdmin 的配置文件 config.inc.php 中修改:
$cfg['Servers'][$i]['hide_db'] = '^(mysql|information_schema|performance_schema|sys)$';
-
$i是当前服务器索引(通常为 0 或 1,取决于你配置了几个服务器) - 正则表达式必须用
^和$严格匹配库名,避免误杀如my_mysql_backup - 多个库用竖线
|分隔,括号包裹,整个模式用单引号 - 修改后无需重启 Web 服务,但需清空浏览器缓存或强制刷新
常见错误:
- 忘记加
^和$,导致test_mysql也被隐藏 - 使用双引号却未转义美元符,PHP 把
$i当作变量解析失败 - 写成数组形式如
['mysql', 'sys']—— phpMyAdmin 不支持这种写法,只认正则字符串
更安全的做法:配合 MySQL 用户权限收紧
hide_db 只是前端隐藏,不能阻止通过 SQL 查询访问。真正防住得靠权限控制:
- 创建专用账号,只授予业务库的
SELECT, INSERT, UPDATE, DELETE,不授予任何系统库权限 - 显式回收已有账号的系统库权限:
REVOKE ALL PRIVILEGES ON `mysql`.* FROM 'webuser'@'%';
- 检查是否残留
GRANT OPTION:它允许用户自行授权,可能绕过限制
注意:MySQL 8.0+ 对 information_schema 的访问控制更严格,但 mysql 库仍需手动处理;而 performance_schema 默认对普通用户只读,隐藏它主要为减少干扰。
隐藏后仍能看到数据库列表顶部的“无数据库选择”提示?
这是 phpMyAdmin 的 UI 行为:当所有数据库都被 hide_db 过滤后,它不会报错,但会显示空列表 + “无数据库选择”文字。这不是配置失效,而是预期表现。
如果此时用户手动在 SQL 标签页执行 SHOW DATABASES;,仍能看到全部库名——因为 hide_db 不影响 SQL 执行,只影响左侧导航栏渲染。
所以,真正的防护边界在 MySQL 权限层,hide_db 只是降低意外点击和认知暴露。别指望单靠它实现安全隔离。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











