多服务器配置会放大phpinfo()泄露风险,因配置块复制易混入临时调试代码,导致所有服务器的host、user、password等明文凭证随phpinfo()全部暴露。

phpMyAdmin 本身不调用 phpinfo(),但多服务器配置若混入测试文件或错误调试逻辑,极易让 phpinfo() 被意外暴露——此时泄露的不只是当前连接的数据库凭证,而是所有已加载配置中明文存在的 host、user、password、socket 路径等敏感字段。
为什么多服务器配置会放大 phpinfo 泄露风险
多人协作维护多个 $cfg['servers'][$i] 时,常见做法是复制粘贴配置块并手动改索引。为快速验证某台新服务器连通性,开发者常在 config.inc.php 末尾临时加一行 phpinfo() 或新建 test.php 放在 phpMyAdmin 目录下。这类文件一旦随部署进入生产环境,且未被清理或限制访问,就会成为统一入口,把所有已加载的 PHP 配置(含 $cfg['servers'] 数组里每个服务器的 host、user、password)全部吐出来。
- phpMyAdmin 加载 config.inc.php 时,会把所有
$cfg['servers']全部读入内存;phpinfo()输出的$_SERVER['SCRIPT_FILENAME']和Loaded Configuration File又会暴露 config 文件路径 - 若 config 文件本身没移出 Web 根目录(如仍放在
/usr/share/phpmyadmin/config.inc.php),phpinfo()页面还能直接显示该文件内容(取决于 PHP 是否启用allow_url_include或解析失败) - Nginx/Apache 若未拦截
/test.php或/info.php,攻击者用字典扫描就能命中
config.inc.php 里绝对不能出现 phpinfo() 调用
即使你只打算“临时加一行看看”,也必须立刻删除。因为 phpMyAdmin 的 config 文件是全局加载的,任何 PHP 代码都会在每次请求时执行一次——包括 phpinfo()。
- 检查命令:
grep -n "phpinfo" /etc/phpmyadmin/config.inc.php(路径依实际安装而定) - 不要用注释包裹:
// phpinfo();仍可能被误删注释后激活;应整行物理删除 - 禁止在 config 文件中写任何调试输出函数:
print_r($cfg)、var_dump($_SERVER)同样危险 - 若需验证服务器配置是否生效,改用登录后查看左下角「服务器信息」面板,它只显示当前选中服务器的有限字段
Web 服务器层必须拦截所有 phpinfo 相关路径
仅靠人工清理 config 文件不可靠,尤其在 CI/CD 自动部署场景下。必须在 Apache/Nginx 层做兜底拦截,确保即使误传了 phpinfo.php,也无法被访问。
立即学习“PHP免费学习笔记(深入)”;
- Apache:在 phpMyAdmin 所在虚拟主机或
.htaccess中添加<FilesMatch "(phpinfo|info|test)\.php$">Require all denied</FilesMatch> - Nginx:在 server 块中,必须放在
location ~ \.php$ { ... }之前,否则会被覆盖:location ~* ^/(phpinfo|info|test)\.php$ { deny all; } - 额外加固:把整个 phpMyAdmin 安装目录加入 Nginx 的
location ^~ /phpmyadmin/ { deny all; },再单独放行白名单 IP(见下一条)
多服务器管理 ≠ 多个公开入口,IP 白名单才是根本防线
配置了 5 台 MySQL 服务器,不代表你要开放 5 个公网访问点。phpMyAdmin 是一个统一入口,所有服务器连接都在同一套认证体系下完成。暴露面越大,phpinfo() 被撞见的概率越高。
- 在 Apache 中限制目录访问:
<Directory /usr/share/phpmyadmin> Require ip 192.168.1.0/24 203.0.113.42 </Directory> - Nginx 中更严格:
location /phpmyadmin/ { allow 192.168.1.0/24; allow 203.0.113.42; deny all; } - 若使用反向代理(如 Cloudflare),注意
remote_addr可能是代理 IP,应配合real_ip_header X-Forwarded-For并校验X-Forwarded-For白名单 - 别信“我改了路径名就安全了”——自动化扫描工具早把
/pma/、/myadmin/、/dbadmin/全列进字典,真正起作用的是 IP 层过滤
最易被忽略的一点:phpMyAdmin 的 config 文件若包含 $cfg['Servers'][$i]['password'] = 'xxx',这个密码不仅用于连接数据库,还会出现在 phpinfo() 的「Environment Variables」和「PHP Variables」区块里——只要 config 文件被加载过,它就在内存里,phpinfo() 就能照单全收。所以,移出 Web 根目录 + 环境变量替代 + 服务器层拦截,三者缺一不可。



















