phpMyAdmin导出文件默认存于$cfg['SaveDir']指定目录,若该路径在Web根目录下则可被未授权访问,必须将其移至非Web可访问路径、禁用保存功能并拦截备份目录直访。
导出文件默认存哪?先确认路径是否在 Web 可访问范围
phpmyadmin 的导出文件(尤其是「保存到服务器」功能生成的)默认写入 $cfg['savedir'] 指定目录,常见值如 /var/lib/phpmyadmin/tmp/ 或 ./tmp/。如果这个路径落在 web 服务器 documentroot 内(比如 /var/www/html/phpmyadmin/tmp/),那么直接请求 https://yoursite.com/phpmyadmin/tmp/backup.sql 就能下载——根本不需要登录。
检查方法:打开 config.inc.php,找 $cfg['SaveDir'] 的值;再对照 Web 服务器配置(Nginx 的 root 或 Apache 的 DocumentRoot),看该路径是否可被 HTTP 访问。
- 若路径在 Web 根下,必须立刻迁移:设为
$cfg['SaveDir'] = '/var/tmp/pma_export/';这类非 Web 目录 - 确保目标目录存在、phpMyAdmin 进程(如 www-data)有写权限,且 Web 服务器无任何
location或Alias映射到它 - 执行
ls -ld /var/tmp/pma_export,确认权限不开放(如drwx------,而非drwxr-xr-x)
Nginx/Apache 必须拦截备份目录的直接访问
即使你把 $cfg['SaveDir'] 移出了 Web 根,仍有人会尝试上传或误放备份文件到 /backup/、/dump/ 等常见路径。靠“别放那儿”不保险,得用 Web 服务器规则硬拦。
Nginx 示例(加在 server 块内):
location ^~ /backup/ { deny all; }
Apache 示例(加在 <directory></directory> 或 .htaccess 中):
RedirectMatch 404 ^/backup/.*$
立即学习“PHP免费学习笔记(深入)”;
-
^~ /backup/比/backup更安全,避免匹配到/backup-logs/ - 不要只禁
.sql后缀——攻击者可能传dump.php或data.zip,必须封整个路径前缀 - 测试是否生效:curl -I https://yoursite.com/backup/test.sql 应返回 403 或 404,而非 200
禁用「保存到服务器」功能,从源头掐断文件落地
只要 $cfg['SaveDir'] 非空,phpMyAdmin 就会在导出页显示「保存到服务器」按钮。用户点一下,文件就落盘——哪怕你拦了 Web 访问,文件本身还在服务器上,运维误操作或提权后仍可能被读取。
最稳妥的做法是清空该配置:
$cfg['SaveDir'] = '';
- 清空后,导出页的「保存到服务器」选项彻底消失,只剩「保存到本地」和「直接执行」
- 配合
$cfg['UploadDir'] = '';,一并关闭导入功能,减少攻击面 - 注意:这不会影响「导出为 SQL 文件并下载到浏览器」,只是不让文件留在服务器磁盘上
导出脚本本身不能被绕过直访
即使界面隐藏了导出按钮、禁用了保存功能,攻击者仍可能直接请求 export.php 或 tbl_export.php。这些脚本若存在且可执行,就能绕过所有前端限制。
- 物理删除或重命名:进入 phpMyAdmin 安装目录,删掉或改名
export.php、db_export.php、tbl_export.php - 若需留个提示,新建同名文件,内容仅含
<?php echo "导出功能已关闭"; ?> - Nginx/Apache 必须禁止对
.php文件的原始输出(防止配置错误导致源码泄露),例如 Nginx 加fastcgi_intercept_errors on;
真正的风险不在「用户能不能点按钮」,而在于「文件是否落地+能否被直访」。这两件事没堵死,其他配置都是补丁。



















