如何让WordPress登录表单先验证CAPTCHA再校验账号密码?
修改方案:先验证CAPTCHA再校验账号密码
原插件的登录验证逻辑依赖login_errors和login_redirect钩子,这两个钩子都是在WordPress完成账号密码校验后才触发的,所以会出现先验证账号密码再验CAPTCHA的问题。要解决这个问题,我们需要改用authenticate钩子(该钩子在账号密码校验前执行),替换原有的两个登录相关钩子函数。
具体修改步骤:
- 保留原插件中的
include_ctl_captcha_for_login函数不变(负责在登录表单渲染CAPTCHA)。 - 删除原有的
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
相关产品推荐
相关产品推荐

