phpmyadmin 安全配置需四步:①禁用废弃mysql扩展,启用mysqli/pdo;②通过mysql权限+only_db/hide_db限制数据库访问;③禁用exec、文件导入导出等高危功能;④强制https、ip白名单及临时目录防护。
phpmyadmin 只允许访问特定数据库(如仅 mysqli,禁用 mysql)
phpmyadmin 本身不直接“限制数据库引擎”,它依赖 php 的扩展来连接 mysql 兼容服务。所谓“只管理指定引擎”,本质是控制它能用哪些 php 扩展连接后端——比如禁用已废弃且有漏洞的 mysql 扩展,强制使用 mysqli 或 pdo_mysql。
常见错误现象:mysqli 扩展已启用,但 phpMyAdmin 启动时仍报 The mysql extension is deprecated 或意外回退到旧连接方式;或在登录页下拉看到不安全的 MySQL(非 MySQLi)选项。
- 检查
config.inc.php中是否显式设置了$cfg['Servers'][$i]['extension']—— 若设为'mysql',必须改为'mysqli'或删掉该行(新版默认优先mysqli) - 确认 PHP 环境中
extension=php_mysql.dll(Windows)或extension=mysql.so(Linux)已被注释或删除;仅保留mysqli和PDO_mysql - 重启 Web 服务(如 Apache/Nginx + PHP-FPM),否则扩展变更不生效
- phpMyAdmin v5.0+ 已完全移除
mysql扩展支持,若仍在用 v4.x,请升级——旧版无法规避 CVE-2018-12613 等因扩展混用引发的路径遍历漏洞
禁止 phpMyAdmin 访问非授权数据库($cfg['Servers'][$i]['AllowRoot'] = false 不够)
关闭 root 登录只是第一步。真正限制“只能管理指定数据库”,靠的是 MySQL 层面的权限控制 + phpMyAdmin 的访问过滤机制,而非界面开关。
使用场景:多租户环境、测试服务器共用同一 phpMyAdmin 实例,但每个用户只能看到自己库。
- MySQL 用户必须按最小权限原则创建,例如:
GRANT SELECT,INSERT,UPDATE,DELETE ON `app_db`.* TO 'user1'@'%'; FLUSH PRIVILEGES;—— 不要给ALL PRIVILEGES ON *.* - 在
config.inc.php中启用数据库过滤:$cfg['Servers'][$i]['hide_db'] = '^(information_schema|performance_schema|mysql|sys)$';,防止用户手动输入库名绕过列表 - 更严格的做法是启用
$cfg['Servers'][$i]['only_db'],设为数组如['app_db', 'log_db'],这样用户登录后只能看到这两个库,连SHOW DATABASES结果都会被截断 - 注意:
only_db是 phpMyAdmin 层过滤,不替代 MySQL 权限。若用户凭其他客户端直连,仍可能越权——所以数据库权限仍是底线
禁用 phpMyAdmin 危险功能(exec、system、文件导入导出)
很多漏洞(如 CVE-2019-12922、CVE-2020-15127)利用点不在 SQL 层,而在 phpMyAdmin 自身的文件操作或命令执行模块。限制引擎只是表象,关掉高危入口才是关键。
典型错误现象:上传一个恶意 .sql 文件触发 LOAD DATA INFILE 或写入 webshell;或通过“设置”→“导入”→“执行任意 SQL”绕过前端限制。
- 在
config.inc.php中禁用执行 shell 命令:$cfg['ExecTimeLimit'] = 0;(虽是超时设置,但设为 0 会禁用部分 exec 调用);更彻底的是确保 PHP 配置中disable_functions包含exec,system,passthru,shell_exec,proc_open - 关闭文件导入导出的本地文件访问:
$cfg['UploadDir'] = '';和$cfg['SaveDir'] = '';,避免用户上传/下载服务器任意路径文件 - 禁用可写配置页:
$cfg['ShowChgPassword'] = false;并确保config.inc.php权限为644且不可被 Web 用户写入 - 如果不需要关系图或 PDF 导出,直接删掉
libraries/plugins/export/下的export_pdf.php等文件——减少攻击面比改配置更可靠
HTTPS + 登录前强制跳转 + IP 白名单(别只信 AllowNoPassword)
即使限制了引擎和数据库,明文传输账号密码、开放给全网、允许空密码登录,等于把钥匙挂在门把手上。
容易踩的坑:$cfg['Servers'][$i]['AllowNoPassword'] = false 设了,但没关掉 Apache 的 .htaccess 认证或 Nginx 的 auth_basic,结果双认证失效;或者开了 HTTPS 但没配 HSTS,用户手输 http 被劫持。
- Web 服务器层必须强制 HTTPS:Nginx 加
return 301 https://$host$request_uri;;Apache 开mod_rewrite并重定向 - phpMyAdmin 自身不处理 IP 限制,得靠 Web 服务器:Nginx 用
allow 192.168.1.0/24; deny all;;Apache 用Require ip 192.168.1.0/24 -
$cfg['LoginCookieValidity']建议设小些(如 1800 秒),避免长期有效 Cookie 泄露后被复用 - 别用
root账号登录 phpMyAdmin——哪怕密码复杂。建专用账号,权限精确到库+表+操作类型
最常被忽略的一点:phpMyAdmin 的 tmp 目录(默认 ./tmp/)如果在 Web 可访问路径下,且未加 .htaccess 或 location 拦截,上传的临时 SQL 文件可能被直接 GET 下载。务必确认该目录不可通过 URL 访问。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











