必须删除setup目录和config.inc.php临时文件,因二者留在Web可访问路径下会允许攻击者重进配置界面、篡改数据库凭据或添加恶意服务器配置;需物理删除setup目录及其中生成的config.inc.php副本。

直接拦截 phpMyAdmin 根目录下的高危文件
phpMyAdmin 默认安装后,/phpmyadmin/config.inc.php、/phpmyadmin/setup/、/phpmyadmin/libraries/ 等路径若被直接请求,可能泄露配置或触发未授权访问。最稳妥的方式是用精确匹配(=)封禁已知敏感入口:
-
location = /phpmyadmin/config.inc.php { return 404; }—— 只拦这个完整路径,不误伤/phpmyadmin/config.example.php -
location ^~ /phpmyadmin/setup/ { deny all; }—— 拒绝整个 setup 子树,^~优先级高于正则,防绕过 -
location ^~ /phpmyadmin/libraries/ { deny all; }—— 同理,该目录下无合法前端资源,全拒
禁止通过路径遍历访问 phpMyAdmin 内部文件
攻击者常构造类似 /phpmyadmin/../etc/passwd 或 /phpmyadmin/./libraries/common.inc.php 的请求试探。Nginx 默认会规范化 URI,但需确保没开启 merge_slashes off,且 root 指向安全:
- 检查
root指令是否明确指向 Web 根(如/usr/share/phpmyadmin),**绝不能是/或/usr** - 确认未启用
autoindex on,否则目录列表暴露文件名 - 添加通用防护:
location ~ \.\.\/ { return 403; }—— 拦含../的原始 URI(注意:仅对未被 Nginx 自动 decode 的请求有效,需配合日志验证)
封禁常见备份与调试文件扩展名
用户上传或开发者遗留的 .php.bak、.inc.save、.log 等文件极易被扫描器捕获,必须统一拦截:
location ~* ^/phpmyadmin/.*\.(bak|save|swp|log|sql|yml|yaml|ini|conf|sh)$ { return 404; }- 注意开头的
^/phpmyadmin/锚定,避免影响其他路径;~*忽略大小写,覆盖.BAK、.SQL - 这条规则要放在
location ~ \.php$fastcgi 处理块之前,否则可能被提前交给 PHP 解释器而绕过
限制 phpMyAdmin 目录仅允许特定 IP 访问
比单纯屏蔽文件更彻底的做法是控制入口流量。若 phpMyAdmin 仅需内部运维使用,应直接限制来源:
立即学习“PHP免费学习笔记(深入)”;
location /phpmyadmin/ { allow 192.168.1.0/24; allow 203.0.113.42; deny all; }- IP 白名单必须写在
location /phpmyadmin/块内,不能只写在 server 块里 - 如果用了 CDN 或反向代理,需同步配置
set_real_ip_from并用$remote_addr替换为真实客户端 IP,否则allow会失效
实际生效前务必重载并测试:curl -I <a href="https://www.php.cn/link/b0cbc684c02ef796806b6300e19d76c3">https://www.php.cn/link/b0cbc684c02ef796806b6300e19d76c3</a> 应返回 404;curl -I <a href="https://www.php.cn/link/c946bc13dbb524aa32e2fc4900143e80">https://www.php.cn/link/c946bc13dbb524aa32e2fc4900143e80</a> 应返回 404 或 403;而正常登录页 /phpmyadmin/index.php 必须仍可访问 —— 这说明你没把 fastcgi 规则挡掉。最容易漏的是规则顺序和 root 路径污染,这两点一旦出错,所有防护都形同虚设。



















