必须修改 config.inc.php 文件禁用导出功能,通过设置 $cfg['Export'] = ['asfile' => false, 'onserver' => false, 'onserverover' => false] 彻底隐藏入口,并在末尾添加 PHP 层拦截 sql.php 的 export_type 参数,防止绕过。
禁用 export 功能需改 config.inc.php 而非界面设置
phpmyadmin 没有后台开关或 web 界面选项能直接关闭导出功能,所有权限控制必须通过配置文件硬性限制。改错位置(比如去改 phpmyadmin/libraries/ 下的源码)不仅无效,下次升级还会被覆盖。
- 必须编辑 phpMyAdmin 根目录下的
config.inc.php(若不存在则复制config.sample.inc.php并重命名) - 在
$cfg['Servers'][$i]['controluser']配置之后、?>之前添加禁用逻辑 - 不能只靠 .htaccess 或 Nginx deny 规则——这些拦不住已登录用户的内部请求,
export.php仍可被 POST 触发
$cfg['Servers'][$i]['DisableIS'] = true 不起作用,得用 $cfg['Export'] 全局开关
有人试过设 DisableIS 或删 export.php,结果发现导出按钮还在、甚至报错后仍能绕过。真正生效的是 $cfg['Export'] 数组,它控制整个导出模块的可见性与可用性。
- 加这段代码即可彻底隐藏导出入口:
$cfg['Export'] = [ 'asfile' => false, 'onserver' => false, 'onserverover' => false, ]; - 即使用户手动访问
export.php,也会因缺少$_POST['what']或校验失败而跳转回首页 - 注意:这个配置对所有数据库生效,不支持按用户或库粒度区分
导出按钮消失 ≠ 导出能力消失,还要封掉 sql.php 的批量执行漏洞
禁用 $cfg['Export'] 后,普通用户点不到导出页,但攻击者若已登录,仍可能构造 POST 请求到 sql.php,加上 sql_query=SELECT+*+FROM+... 和 export_type=sql 参数,绕过前端限制直接触发导出。
- 最稳妥的做法是配合 PHP 层拦截:在
config.inc.php末尾加if (basename($_SERVER['SCRIPT_NAME']) === 'sql.php' && !empty($_POST['export_type'])) { die('Export disabled'); } - 或者更彻底:在 Web 服务器层拒绝含
export_type=的 POST 请求(Nginx 可用if ($args ~ export_type=) { return 403; }) - 别依赖 JS 禁用按钮——DOM 操作完全可绕过
重启 Web 服务不是必须的,但浏览器缓存会让禁用延迟生效
改完 config.inc.php 后,phpMyAdmin 是运行时读取配置,不需要重启 Apache/Nginx/PHP-FPM。但浏览器可能缓存了旧的 JS 或 CSS,导致导出按钮“看起来还在”。
- 强制刷新页面(
Ctrl+F5或清空当前站点缓存) - 检查网络面板,确认
export.php返回的是 302 跳转或空白页,而非 200 + HTML 表单 - 如果用了 OPcache,可临时执行
opcache_reset()(需在允许的上下文中),否则新配置可能延迟 1–2 分钟才加载
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











