不能直接用默认 ./upload 目录,因其位于 web 可访问路径下,导致上传的 sql 文件可被公网直接下载甚至执行;必须设为 web 不可达的绝对路径(如 /var/lib/phpmyadmin/upload),并同步配置权限、upload_tmp_dir、open_basedir 及 $cfg['savedir']。

为什么不能直接用默认 ./upload 目录?
默认的 $cfg['UploadDir'] = './upload' 会让 phpMyAdmin 从 Web 可访问路径(如 /phpmyadmin/upload/)读取 SQL 文件,这等于把用户上传的任意文件暴露在公网下。攻击者只要知道路径,就能直接 GET 下载甚至执行恶意脚本(尤其当服务器配置不当、.php 文件未被禁止解析时)。这不是理论风险——真实漏洞案例中已有因该目录可列目录导致数据库凭据泄露的事件。
$cfg['UploadDir'] 必须指向 Web 根目录外的绝对路径
正确做法是把上传目录设为 Web 服务器无法直接 HTTP 访问的位置,例如:
$cfg['UploadDir'] = '/var/lib/phpmyadmin/upload';
然后确保:
- 该路径存在且由 Web 服务器用户(如
www-data或nginx)拥有写权限:sudo chown www-data:www-data /var/lib/phpmyadmin/upload - Web 服务器配置中未将该路径映射为任何
location或Alias(Nginx/Apache 都要检查) - 不要用相对路径或以
./开头的路径,phpMyAdmin 会自动将其解释为相对于当前 Web 路径
必须同步调整 PHP 的 upload_tmp_dir 和 open_basedir
即使 $cfg['UploadDir'] 指向安全位置,PHP 本身仍会先将文件暂存到 upload_tmp_dir。如果这个临时目录仍在 Web 可写区(比如默认的 /tmp),且 open_basedir 未限制,攻击者仍可能通过其他入口点利用它。所以要确认:
-
upload_tmp_dir在php.ini中显式设为独立目录,如/var/tmp/php-upload -
open_basedir包含该临时目录和$cfg['UploadDir']路径,但**不包含 Web 文档根目录以外的敏感路径**(如/etc、/root) - 重启 PHP-FPM 或 Apache 后,用
phpinfo()页面验证两项配置是否生效
别忘了 $cfg['SaveDir'] 同样危险
$cfg['SaveDir'] 控制导出文件存放位置,如果设成 ./save,导出的 SQL 文件也会被公开下载。处理方式完全一致:必须使用 Web 不可达的绝对路径,例如 /var/lib/phpmyadmin/save,并赋予相同权限与隔离策略。一个常见疏漏是只改了 UploadDir 却忽略 SaveDir,导致导出功能反而成了新的攻击面。
最易被忽略的一点:phpMyAdmin 不校验 UploadDir 目录是否真的不可 Web 访问——它只负责从那里读取文件。你得自己用浏览器尝试访问对应 URL 来验证,比如把 $cfg['UploadDir'] 设成 /var/www/html/upload 后,再请求 https://yoursite.com/upload/test.sql,如果能下载,说明配置失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











