先执行show grants for current_user();确认是否有grant select on mydb.*等对应库权限,若无则为权限缺失;若有而仍不可见,再排查phpmyadmin的hide_db/only_db配置或连接用户不一致问题。
phpmyadmin 里用户看不到自己库,先查 mysql 实际权限
用户登录后看不到预期的库,90% 是 mysql 层面权限没给到位,不是 phpmyadmin 配置问题。执行 show grants for current_user(); 看输出里有没有类似 grant select on `mydb`.* to 'user1'@'%' 这样的语句。没有就说明权限缺失;有但还是不显示,再往下排查。
注意:CURRENT_USER() 返回的是认证时用的用户名+host(比如 'user1'@'192.168.1.100'),而 USER() 可能返回代理名,权限检查必须用前者。
- 用命令行 MySQL 客户端以同一用户连接,执行
SHOW DATABASES;—— 如果也看不到目标库,100% 是权限问题 - 如果命令行能看到、phpMyAdmin 看不到,再查
$cfg['Servers'][$i]['hide_db']是否误匹配了库名(比如正则写了'^(mysql|information_schema)$'却漏掉了锚点,实际干掉了所有库) -
$cfg['Servers'][$i]['only_db']是更严格的过滤,设为['myapp_db']后,SHOW DATABASES结果会被截断,只返回该库(但前提是用户已有该库权限)
配置文件里别留“备用服务器”,否则用户全都能选
phpMyAdmin 登录页列出的所有服务器,完全取决于 config.inc.php 里 $cfg['Servers'] 数组定义了多少项——它**不校验权限**,只是原样渲染下拉菜单。用户选一个,才真正尝试用凭据去连;连不上就报错,进不了主界面。
所以“限制用户只能看到自己能连的服务器”,唯一可靠方式是:删掉他无权访问的 $cfg['Servers'][$i] 条目。留着就是隐患。
- 检查
$cfg['Servers'][$i]['auth_type']:如果是'config',实际连接用户是$cfg['Servers'][$i]['user'],跟你登录时输的账号无关 - 确保该
user在 MySQL 中只允许从 phpMyAdmin 所在主机连接,例如CREATE USER 'srv1_admin'@'192.168.10.5',不能用'%' -
$cfg['Servers'][$i]['hide_db']和only_db对登录页服务器列表毫无影响,它们只作用于已成功连接后的数据库列表
MySQL 用户权限必须精确到库名,不能靠通配符糊弄
MySQL 的 SHOW DATABASES 结果,本质是查 mysql.db 表里 User+Host+Db 三元组是否存在任意一条记录。这意味着:只要有一条 'alice'@'%' ON `bob`.* 的授权,alice 就能在 phpMyAdmin 里看到 bob 库(哪怕进不去)。
所以“只让 alice 看 alice 库”,必须做到两点:建库、授权、刷新,缺一不可。
- 先执行
CREATE DATABASE `alice`;(反引号防特殊字符) - 再执行
GRANT SELECT, INSERT, UPDATE, DELETE ON `alice`.* TO 'alice'@'%'; - 必须跟
FLUSH PRIVILEGES;,尤其在直接改mysql.db表后 - 避免
GRANT USAGE ON *.*—— 它会让用户看到所有库名(哪怕没权限操作) - 检查残留权限:
SELECT COUNT(*) FROM mysql.db WHERE User='alice' AND Host='%';,结果应只有一行且Db='alice'
phpMyAdmin 自身功能开关不替代 MySQL 权限
$cfg['Servers'][$i]['AllowRoot'] = false 或禁用 exec 功能,都不能代替最小权限原则。它们只是辅助防线,真正在底层起作用的是 MySQL 的 GRANT 规则。
比如你开了 only_db,但用户用其他客户端(如 MySQL CLI、DBeaver)直连,照样能越权——只要 MySQL 权限没卡死。
- 只读账户必须显式
GRANT SELECT ON `sales_db`.*,而不是靠REVOKE INSERT,UPDATE来“补漏” - 禁用 phpMyAdmin 文件导入导出功能(
$cfg['UploadDir'] = '')、禁用exec($cfg['ExecTimeLimit'] = 0)可堵住 CVE-2019-12922 类漏洞,但不影响库可见性逻辑 - MySQL 8.0+ 新建用户默认用
caching_sha2_password插件,PHP 连接需启用mysqli扩展并确认支持该插件,否则连都连不上,更别说看库
实际部署时最容易被忽略的点:phpMyAdmin 登录页显示的服务器列表和用户最终能看到哪些库,是两套完全独立的机制——前者由配置文件硬编码决定,后者由 MySQL 的 mysql.db 表内容决定。混在一起调,只会反复踩坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











