phpMyAdmin 4.9+ 启用 reCAPTCHA v2 必须同时配置 $cfg['CaptchaLogin'] = true、$cfg['CaptchaLoginPublicKey'] 和 $cfg['CaptchaLoginPrivateKey'],缺一不可;仅填密钥无效,且验证码仅作用于登录环节的 cookie/http 认证,不防弱口令或已窃取 Cookie。
phpmyadmin 4.9+ 必须显式启用 $cfg['captchalogin'] = true,仅填密钥不生效;且 recaptcha v2 不防弱口令或已窃取的 cookie,只对 cookie/http 认证方式起作用。
必须配全三项配置才能显示验证码框
常见现象是登录页没出现复选框、提交后直接跳过验证、或报 Invalid or missing reCAPTCHA keys 错误。根本原因不是“忘了开开关”,而是三项缺一不可:
-
$cfg['CaptchaLogin'] = true;—— 这是总闸,不设就完全不加载验证码逻辑 -
$cfg['CaptchaLoginPublicKey']填 Google reCAPTCHA 控制台生成的 site key(前端用) -
$cfg['CaptchaLoginPrivateKey']填对应的 secret key(后端校验用)
密钥中若含 +、/、= 等字符,需确认 PHP 未开启已废弃的 magic_quotes_gpc(某些旧定制镜像仍残留)。
域名必须是正式备案域名,localhost 和 IP 地址无效
Google reCAPTCHA v2 要求注册时填写的域名与实际访问地址严格一致。你在控制台填了 phpmyadmin.example.com,但浏览器访问的是 http://192.168.1.100/phpmyadmin 或 http://localhost/phpmyadmin,验证码必然不加载。
- 本地开发测试:改
/etc/hosts,绑定如127.0.0.1 phpmyadmin.dev,然后用https://phpmyadmin.dev访问 - 内网环境:不能用私有 IP 注册,需走泛域名或子域名备案(如
dbadmin.corp.internal配 DNS 解析) - HTTP 协议下部分浏览器会拒绝加载 reCAPTCHA 脚本,务必用 HTTPS
验证码只在登录环节生效,不覆盖其他攻击面
它只校验登录表单提交,对以下场景完全无效:
立即学习“PHP免费学习笔记(深入)”;
- 已登录会话发起的 SQL 注入(比如篡改
sql_query参数) - 通过
import.php或sql.php直接 POST 的恶意请求(绕过登录页) - 利用泄露的 Cookie 或 token 的重放攻击
reCAPTCHA 私钥校验调用的是 https://www.google.com/recaptcha/api/siteverify,国内服务器需注意超时问题:curl_setopt($ch, CURLOPT_TIMEOUT, 5) 是必要兜底,否则登录页面可能卡死数秒才失败。
它不支持“失败 N 次后才触发”的条件启用
phpMyAdmin 没有内置“前 3 次输错密码不弹验证码,第 4 次才弹”的策略。只有全局开关:true 或 false。这意味着所有用户每次登录都得过人机验证,哪怕你是从白名单 IP 进来的管理员。
如果你真需要按行为动态触发,得自己在 Nginx 层加限流 + 返回特定 header,再配合前端 JS 判断是否注入 reCAPTCHA 脚本——但这已超出 phpMyAdmin 原生能力范围,且容易和它的 JS 加载逻辑冲突。



















