phpMyAdmin 4.9+ 才支持原生2FA,需启用ext-gmp和ext-openssl扩展、配置$cfg['TwoFactor'] = true;并确保服务器时间同步,否则TOTP验证失败。
phpMyAdmin 4.9+ 版本才支持原生 2FA
低于 4.9.0 的版本压根没有 two_factor 配置入口,硬改配置文件也不会生效。官方从这个版本开始集成 totp(基于时间的一次性密码),依赖 php 的 ext-gmp 和 ext-openssl 扩展——缺一个,登录页就直接报 two-factor authentication is not available。
实操建议:
- 先确认版本:
grep -o 'Version.*[0-9]\+\.[0-9]\+' /path/to/phpmyadmin/libraries/Config.class.php - 检查扩展是否启用:
php -m | grep -E '^(gmp|openssl)$',注意 Apache 和 CLI 的 PHP 配置可能不同 - 若用 Docker,别只在容器里装扩展,还要确保
php.ini中未禁用:extension=gmp.so和extension=openssl.so必须生效
启用 2FA 后用户必须手动绑定,无自动 fallback
开启后,所有用户首次登录会看到二维码和密钥,但不会自动跳转或提示绑定——如果用户刷新页面、关掉扫码页,或者误点“跳过”,phpMyAdmin 就卡在登录态外,且不会回退到普通密码登录。后台没留开关,只能删数据库记录或手动重置。
常见错误现象:
- 扫描成功但验证失败:多半是服务器时间不同步,
ntpdate -s time.nist.gov或启用systemd-timesyncd - 绑定后仍被要求二次验证:检查
$cfg['Servers'][$i]['auth_type']是否为cookie(http模式不支持 2FA) - 管理员无法登录:因为
root用户默认未启用 2FA,需先用其他有权限的账号登录,再进「用户账户」→「编辑权限」→ 勾选「启用双因素认证」
config.inc.php 中必须显式开启 two_factor 配置项
phpMyAdmin 不会默认读取或推断 2FA 状态,即使扩展齐全、版本够新,漏写这一行就等于没开:
立即学习“PHP免费学习笔记(深入)”;
$cfg['TwoFactor'] = true;
注意不是 $cfg['two_factor'],大小写敏感;也不能放在 $cfg['Servers'] 数组内——它属于全局配置。如果同时启用了 $cfg['LoginCookieValidity'],建议设为 ≤ 1800(30 分钟),否则 TOTP 验证通过后,登录态过长反而削弱 2FA 效果。
性能影响很小,但每次登录会多一次 HMAC-SHA1 计算,对低配 VPS 几乎无感;兼容性上,旧版 Firefox(
备份恢复时容易丢掉 2FA 绑定信息
用户绑定的密钥存在 phpmyadmin 数据库的 user_config 表中,字段是 config_data(JSON 格式),含 two_factor_secret。mysqldump 默认不导出该库,也不包含 --routines --triggers --events 外的元数据——恢复后用户会发现「已启用 2FA」但扫不出码。
安全加固提醒:
- 备份命令必须显式包含:
mysqldump --databases phpmyadmin > pma-backup.sql - 禁止把
config.inc.php放在 Web 可访问路径下,尤其不能泄露$cfg['blowfish_secret']——它参与加密user_config内容 - 若用 LDAP 或 HTTP 认证集成,2FA 仅作用于 phpMyAdmin 自身登录层,不接管上游认证流程
最常被忽略的是:改完配置后没清浏览器 Cookie 和本地存储,导致前端仍缓存旧的登录逻辑,看起来像功能没生效。



















