phpMyAdmin 中 information_schema 仍显示是因为 hide_db 配置未正确设置;需在 config.inc.php 中用 PCRE 正则(如 '/^(information_schema|...)$/i')配置服务器级 $cfg'Servers'['hide_db'],且须配合 MySQL 层权限控制才真正安全。
phpMyAdmin 里 information_schema 还在列表里?关不掉是因为没配对地方
默认 phpmyadmin 不会隐藏 information_schema,哪怕你用的是普通用户登录、也没权限查它——它只是“列出来”,不等于能点进去。真正起作用的是 $cfg['servers'][$i]['hide_db'] 配置项,但它只在「服务器级配置」生效,且只对当前登录用户可见的数据库列表起效。
- 必须在
config.inc.php里改,不是在界面设置里点几下就能关 - 该配置是正则匹配,不是模糊搜索,
information_schema要写全,不能只写info - 如果用了多服务器配置(
$i> 0),得确认改的是当前连接对应的索引项
hide_db 正则写错导致整个数据库列表空白
常见错误是把 hide_db 写成字符串而非正则表达式,比如写成 'information_schema',结果 phpMyAdmin 解析失败,直接不显示任何库。它要求的是 PCRE 兼容正则,且必须用分隔符包裹。
- 正确写法:
$cfg['Servers'][$i]['hide_db'] = '/^(information_schema|performance_schema|mysql|sys)$/i'; - 结尾的
i是忽略大小写,防止某些环境返回大写名 - 开头
^和结尾$很关键,否则my_information_schema这类名字也会被误杀 - 别漏掉分号,phpMyAdmin 启动时解析失败会静默降级,但列表可能异常
用户视图过滤 ≠ 数据库权限控制
隐藏 information_schema 列表只是前端视觉过滤,不影响实际 SQL 执行。如果用户能执行查询,仍可能通过 SELECT * FROM information_schema.TABLES 拿到元数据——这取决于 MySQL 账户本身有没有 SELECT 权限,不是 phpMyAdmin 能拦住的。
- MySQL 8.0+ 默认关闭普通用户访问
information_schema的部分表(如STATISTICS),但SCHEMATA和TABLES通常仍可查 - 真要限制,得在 MySQL 层 revoke:
REVOKE SELECT ON information_schema.* FROM 'user'@'host'; - phpMyAdmin 的
hide_db和 MySQL 权限是两层逻辑,别以为隐藏了就等于安全了
改完 config.inc.php 没生效?检查缓存和加载顺序
phpMyAdmin 会缓存配置,尤其是用 Apache + mod_php 时,改完文件不重启服务或不清理 OPcache,旧配置还在跑。
- 确认修改的是正在用的
config.inc.php:检查 phpMyAdmin 根目录下是否存在,且没被config.sample.inc.php覆盖 - 如果用了环境变量或外部配置加载(如 Docker 中挂载),优先级可能高于本地文件
- 加一行
die('config loaded');在配置末尾临时测试是否被读取 - 浏览器端强制硬刷新(Ctrl+Shift+R),排除前端 JS 缓存干扰
改 hide_db 看似简单,但正则边界、配置加载路径、MySQL 实际权限三者稍有错位,列表就可能全空、部分残留,或者看起来藏了实则一查就露馅。最麻烦的是你以为藏好了,结果用户换条 SQL 就绕过去了。
立即学习“PHP免费学习笔记(深入)”;











