You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让WordPress登录表单先验证CAPTCHA再校验账号密码?

修改方案:先验证CAPTCHA再校验账号密码

原插件的登录验证逻辑依赖login_errors和login_redirect钩子,这两个钩子都是在WordPress完成账号密码校验后才触发的,所以会出现先验证账号密码再验CAPTCHA的问题。要解决这个问题,我们需要改用authenticate钩子(该钩子在账号密码校验前执行),替换原有的两个登录相关钩子函数。

具体修改步骤:

  1. 保留原插件中的include_ctl_captcha_for_login函数不变(负责在登录表单渲染CAPTCHA)。
  2. 删除原有的include_ctl_captcha_login_errors和include_ctl_captcha_login_redirect函数,替换为以下新的钩子函数:
/* 替换原错误处理和重定向函数,改用authenticate钩子先验证CAPTCHA */
function include_ctl_captcha_authenticate($user, $username, $password) {
    // 跳过注册流程的验证
    if (isset($_REQUEST['action']) && 'register' == $_REQUEST['action']) {
        return $user;
    }

    // 检查CAPTCHA是否存在且有效
    if (!isset($_SESSION['captcha_code']) || !isset($_REQUEST['captcha_code'])) {
        return new WP_Error('captcha_error', __('请输入CAPT验证码!', 'captcha-code-authentication'));
    }

    // 验证CAPTCHA是否正确
    if (esc_html($_SESSION['captcha_code']) != $_REQUEST['captcha_code']) {
        // 清除已有的认证Cookie(如果有的话)
        wp_clear_auth_cookie();
        // 返回CAPTCHA错误,阻止后续账号密码验证
        return new WP_Error('captcha_error', __('CAPT验证码错误!', 'captcha-code-authentication'));
    }

    // CAPTCHA验证通过,继续执行默认的账号密码验证
    return $user;
}
// 挂载authenticate钩子,优先级设为10(确保在默认验证前执行)
add_filter('authenticate', 'include_ctl_captcha_authenticate', 10, 3);

修改说明:

  • authenticate钩子:这是WordPress登录流程中较早的验证钩子,接收$user、$username、$password三个参数,在这个阶段先校验CAPTCHA,一旦验证失败直接返回错误,终止后续的账号密码验证流程。
  • 错误处理:使用WP_Error返回错误信息,WordPress会自动在登录表单上显示该错误,无需额外的重定向逻辑。
  • 注册流程兼容:保留了原代码中跳过注册流程的判断,避免影响用户注册功能。
  • 安全优化:CAPTCHA验证失败时清除认证Cookie,确保不会残留无效的登录状态。

注意事项:

  • 修改后请测试登录流程:输入错误CAPTCHA时,直接显示验证码错误,不会校验账号密码;输入正确CAPTCHA后,才会进行账号密码的验证。
  • 若插件后续更新,建议将修改后的代码复制到主题的functions.php文件中,避免插件更新覆盖修改内容。

内容的提问来源于stack exchange,提问作者charll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:37