不能靠phpMyAdmin自身实现多租户,必须物理隔离部署路径、独立config.inc.php(blowfish_secret不同)、独立PHP-FPM pool(session.save_path和open_basedir分离),并由Web服务器严格限制访问路径与IP,同时MySQL权限须精确到库级且禁用危险命令。
不能靠 phpmyadmin 自身实现多租户数据库实例的“逻辑管理”,它只是个前端工具;真正隔离必须靠物理部署+web 服务器路径控制+mysql 权限绑定,否则租户之间会互相看到库、甚至越权操作。
为什么不能只改 config.inc.php 就算多租户?
phpMyAdmin 的 $cfg['Servers'] 只是定义“连哪台 MySQL”,不是“谁能看到哪些库”。如果你把 dev、prod、customer_a 全写进同一个 config.inc.php,且都用 auth_type = 'cookie',那用户登录后就能在下拉列表里自由切换——这等于把所有钥匙串挂在一个钩子上。
- 漏设
$cfg['Servers'][$i]['hide_db']→ 用户能看到information_schema甚至其他租户的库名 - 用了
auth_type = 'config'但填了高权限账号(如root)→ 实际绕过租户边界 - 多个实例共用同一份代码 + 同一 PHP-FPM pool → session、
blowfish_secret、open_basedir全部交叉污染
必须为每个租户建独立物理目录和配置文件
比如客户 A 要管自己的 customer_a_db,就得单独部署一套:
- 路径:/var/www/phpmyadmin-customer-a/(不能是软链或 alias 指向主目录)
- 配置文件:
/var/www/phpmyadmin-customer-a/config.inc.php中只保留一个$cfg['Servers'][1] -
$cfg['Servers'][1]['user']和$cfg['Servers'][1]['password']必须是仅对customer_a_db授权的账号,且权限不含SHOW DATABASES -
$cfg['blowfish_secret']随机生成,与其他实例完全不同(否则 Cookie 会互相登出)
Apache/Nginx 的 location 块必须严格绑定到该路径,例如 Nginx:
location /phpmyadmin-customer-a/ {
alias /var/www/phpmyadmin-customer-a/;
index index.php;
}Web 服务器层必须做 IP 和路径双重访问控制
phpMyAdmin 没有 RBAC,它的“用户管理”只是前端展示。攻击者只要知道路径,就能直接请求 /phpmyadmin-customer-a/import.php 绕过登录页。
立即学习“PHP免费学习笔记(深入)”;
- 开发组实例只允许内网 IP:
allow 192.168.10.0/24; deny all; - 生产实例只放行 DBA 办公室固定出口 IP
- 客户实例禁止外部访问,或强制走 HTTPS + 域名白名单(如只响应
Host: customer-a.example.com) - 禁用全局入口:
Alias /phpmyadmin /dev/null或直接删掉服务器级配置
MySQL 层权限必须精确到库级且禁用危险命令
即使路径和 PHP 配置都对了,MySQL 权限没锁死,照样穿帮。
- 执行:
GRANT SELECT,INSERT,UPDATE,DELETE ON customer_a_db.* TO 'customer_a_app'@'localhost'; - 严禁:
GRANT ALL PRIVILEGES ON *.*或ON customer_a_db.* TO 'customer_a_app'@'%'(后者允许任意 IP 连接) - 在对应实例的
config.inc.php中加:$cfg['AllowUserDropDatabase'] = false;、$cfg['ShowDatabasesCommand'] = false; - 如果租户库名有前缀(如
cust_a_orders),用$cfg['Servers'][1]['hide_db'] = '^cust_b_';再加系统库正则,双重过滤
最易被忽略的一点:PHP-FPM pool 的 session.save_path 和 open_basedir 必须按实例隔离。共用 pool 意味着一个租户的 session 文件可能被另一个读取,open_basedir 不设会导致跨目录包含恶意配置。



















