必须撤掉mysql的file权限并禁用phpmyadmin高危导出功能:撤销file权限、设置secure_file_priv、清空savedir、关闭mime支持、移除php/sql导出格式、过滤敏感字段、大库改用mysqldump或python处理、删除export.php等脚本。
导出前必须撤掉 mysql 的 file 权限
哪怕你只是想用 phpmyadmin 导出 sql 文件,只要 mysql 用户保留 file 权限,攻击者就能绕过界面、直接发 select ... into outfile 生成 webshell。这不是理论风险——真实渗透中常被利用。
执行以下语句(替换为实际账号):REVOKE FILE ON *.* FROM 'pma_user'@'%';
然后在 MySQL 配置文件(my.cnf)中设:secure_file_priv = /tmp/
重启 MySQL 后验证:SELECT 'test' INTO OUTFILE '/tmp/test.txt'; 应报错 ERROR 1290 或 ERROR 1045
导出时禁用高危格式与自动保存目录
phpMyAdmin 自身的导出逻辑可能被诱导生成可执行内容,比如导出 CSV 时字段含 PHP 标签、再改后缀上传执行。
- 在
config.inc.php中清空导出目录:$cfg['SaveDir'] = ''; - 关闭 MIME 类型支持:
$cfg['Export']['disable_mime'] = true; - 从
$cfg['Export']['format']数组中移除'php'、'sql'(若非必需),只留'csv'、'json'等纯数据格式 - 确保
$cfg['UploadDir']指向非 Web 可访问路径(如/var/tmp/pma_upload),且该目录无 PHP 解析权限
导出内容需过滤敏感字段而非仅靠“脱敏选项”
phpMyAdmin 没有内置字段级脱敏功能。所谓“导出时模糊手机号”之类操作,必须在导出后或导出前用 SQL 处理,不能依赖界面勾选。
推荐做法是:先用自定义 SQL 查询构造脱敏结果,再导出:
SELECT id, username, CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) AS phone, CONCAT(LEFT(id_card, 6), '******', RIGHT(id_card, 4)) AS id_card FROM users WHERE created_at > '2026-01-01';
然后点击结果页的「导出」按钮——此时导出的是已处理后的结果集,不是原始表。
注意:CONCAT 和 LEFT/RIGHT 在 MySQL 5.7+ 支持良好;若用 MariaDB 或旧版 MySQL,需换用 SUBSTR。
大库导出别硬扛 phpMyAdmin,优先用 mysqldump + 过滤管道
phpMyAdmin 导出几百 MB 数据极易超时、卡死或截断,且无法在导出过程中做字段清洗。
真正可控的方式是命令行组合:
mysqldump -u root -p --no-create-info --skip-extended-insert mydb users \
| sed "s/^\(INSERT.*VALUES (.*'\)[0-9]\{3\}[0-9]\{4\}[0-9]\{4\}\('\)/\1****\2/g" \
> users_anonymized.sql
或者用更可靠的方案:导出为 CSV,用 Python 处理后再转回 SQL:
- 导出时选
CSV for MS Excel,字符集选utf8mb4 - 用脚本读取 CSV,对指定列正则替换(如手机号、身份证)
- 再用
csvsql或自写逻辑生成 INSERT 语句
物理层面最保险的封堵是删掉 export.php、tbl_export.php 等脚本——配置和权限都可能被绕过,但文件不存在就是真不存在。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











