控制用户由 $cfg['Servers'][$i]['controluser'] 和 $cfg['Servers'][$i]['controlpass'] 两行定义,位于 config.inc.php 的服务器配置块内(通常为 $i = 1),二者必须同时存在且与 MySQL 中创建的专用账户及权限严格匹配,否则高级功能(如关系视图)将失效。
config.inc.php 里哪几行定义了控制用户?
phpmyadmin 的控制用户(controluser)是用于高级功能(如“跟踪”“关系视图”“pdf 导出”等)的专用 mysql 账户,它不是你登录 phpmyadmin 用的账户,而是 phpmyadmin 后台用来执行跨库元数据操作的账户。它由 $cfg['servers'][$i]['controluser'] 和 $cfg['servers'][$i]['controlpass'] 两行共同定义,通常出现在 config.inc.php 中 $cfg['servers'][$i] 配置块内($i 一般是 1,即第一个服务器配置)。
如果你没手动配过,这两行很可能根本不存在——此时 phpMyAdmin 默认不启用控制用户功能,相关功能(比如“关系”标签页)会灰掉或报错。
怎么安全地添加或修改 controluser 账户?
不能只改 PHP 配置,必须同步在 MySQL 里创建对应用户并授予权限,否则 phpMyAdmin 启动时会静默失败或报 #1045 Cannot log in to the MySQL server 类错误(即使你自己的登录不受影响)。
- 先用 root 或高权限账户登录 MySQL:
mysql -u root -p - 创建控制用户(示例用用户名
pma_control,密码secure_pass_2024):CREATE USER 'pma_control'@'localhost' IDENTIFIED BY 'secure_pass_2024';
- 授权(注意:必须指向 phpMyAdmin 自带的
phpmyadmin数据库,且需要SELECT, INSERT, UPDATE, DELETE权限):GRANT SELECT, INSERT, UPDATE, DELETE ON `phpmyadmin`.* TO 'pma_control'@'localhost';
- 如果还没创建
phpmyadmin库,需先导入sql/create_tables.sql(路径在 phpMyAdmin 安装目录下)
然后打开 config.inc.php,在对应 $cfg['Servers'][1] 块里加上:
$cfg['Servers'][1]['controluser'] = 'pma_control';<br>$cfg['Servers'][1]['controlpass'] = 'secure_pass_2024';
为什么改完 config.inc.php 还看不到“关系”或“跟踪”选项?
常见原因不是配置写错了,而是权限没生效或数据库结构缺失:
立即学习“PHP免费学习笔记(深入)”;
-
phpmyadmin数据库存在,但表不全——运行SELECT COUNT(*) FROM `phpmyadmin`.`pma__table_uiprefs`;,若报错说明表未初始化 - 控制用户被限制了主机名(例如设成了
'pma_control'@'127.0.0.1'),但 phpMyAdmin 是通过localhost连接的,MySQL 会视为不同用户(Unix socket vs TCP) - PHP 缓存了旧配置(尤其是用 opcache 时),改完
config.inc.php后要重启 Web 服务或清空 opcache - phpMyAdmin 版本较新(5.2+),默认要求控制用户拥有
TRIGGER权限才能启用某些功能,需补授权:GRANT TRIGGER ON `phpmyadmin`.* TO 'pma_control'@'localhost';
能不能让 controluser 不用密码明文写在 config.inc.php 里?
不能。phpMyAdmin 不支持从环境变量、外部文件或密钥管理服务加载 controlpass。所有版本都强制要求明文写在配置中。唯一缓解方式是确保 config.inc.php 文件权限严格(如 600 或 640),且不在 Web 可访问路径下(例如不放在 /var/www/html/ 下,而放在 /etc/phpmyadmin/ 或 /usr/share/phpmyadmin/ 等非公开目录)。
这个设计是历史遗留,也是最常被忽略的安全盲点:哪怕你把登录用户设为强密码,只要攻击者拿到服务器文件读取权限,controluser 凭据就直接暴露,等于给了他操作 phpmyadmin 元数据表的完整入口。



















