必须从mysql权限、phpmyadmin配置、文件系统三层封堵导出功能:撤file权限、设secure_file_priv=/tmp/、清空$cfg['savedir']、删除export.php等脚本,并用only_db+hide_db限制数据库可见范围。
不能只靠界面隐藏或删按钮——phpmyadmin 的导出功能由多个 php 脚本协同驱动,禁用必须从权限、配置、文件层三路封堵,否则攻击者仍可能通过直接请求 export.php 或构造 sql 触发 into outfile 绕过。
撤掉 MySQL 层的 FILE 权限和 secure_file_priv
这是最根本的一环。phpMyAdmin 本身不执行写文件操作,它只是把你的 SQL 原样发给 MySQL;只要 MySQL 允许 INTO OUTFILE,攻击者就能用一条 SELECT 生成 WebShell。
- 执行
REVOKE FILE ON *.* FROM 'pma_user'@'%';(替换为实际账号),立刻剥夺写文件能力 - 在 MySQL 配置文件(
my.cnf)中设secure_file_priv = /tmp/,禁止写入 Web 可访问路径;绝对不要设成空字符串'' - 重启 MySQL 生效后,手动验证:
SELECT 'test' INTO OUTFILE '/tmp/test.txt';应报错ERROR 1290或ERROR 1045
清空 phpMyAdmin 的导出目录与格式支持
即使 MySQL 层禁了 INTO OUTFILE,phpMyAdmin 自身的导出逻辑仍可能被诱导生成可执行文件(比如导出为 .php 后缀的 CSV 再改名上传)。
- 在
config.inc.php中设$cfg['SaveDir'] = '';,让「导出到服务器」按钮彻底消失 - 禁用高危导出格式:
$cfg['Export']['disable_mime'] = true;,并从$cfg['Export']['format']数组中移除'php'、'sql'(若非必需)等选项 - 确保
$cfg['UploadDir']为空或指向非 Web 目录(如/var/tmp/pma_upload),且该目录无 PHP 解析权限
删掉或拦截导出脚本文件(物理级禁用)
前端隐藏或配置关闭都可能被绕过。最硬核的做法是让关键导出脚本根本不存在或返回固定提示。
- 进入 phpMyAdmin 安装目录(如
/var/www/html/phpmyadmin),重命名或删除以下文件:export.php、db_export.php、tbl_export.php、server_export.php - 若需留个“门面”,新建同名文件,内容仅含:
<?php echo "导出功能已关闭,请联系 DBA 提交工单"; ?> - 注意:Nginx/Apache 必须禁止直接访问
.php文件的原始输出(防止配置错误导致源码泄露)
用 only_db + hide_db 锁死可见数据库范围
导出的前提是用户能看到库——如果连库名都不显示,导出动作就无从发起。
- 在
config.inc.php的服务器配置块内($cfg['Servers'][$i]下)设置:$cfg['Servers'][$i]['only_db'] = ['app_production', 'logs'];,用户登录后只能看到这两个库 - 同时配
$cfg['Servers'][$i]['hide_db'] = '^(mysql|information_schema|sys|performance_schema)$';,双重过滤系统库 - 注意:
only_db是 phpMyAdmin 层过滤,不能替代 MySQL 权限;必须配合 GRANT 语句限制账号实际可访问的库
真正安全的禁用不是“不让点导出按钮”,而是让导出路径在 MySQL 层不可写、在 phpMyAdmin 层不可达、在文件系统层不存在——三者缺一不可。最容易被忽略的是:即使你删了所有导出页面,只要 SELECT ... INTO OUTFILE 在 MySQL 里还能跑通,风险就始终存在。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











