自定义认证过滤器钩子失效,WordPress登录验证代码求助
修复m0ri-login-math登录验证插件问题
原代码核心问题
- 表单输入获取错误:WordPress登录表单默认用POST提交,原代码错误使用
$_GET获取输入值 - 会话处理不当:重复调用
session_start(),且在渲染表单时提前存储未提交的用户输入 authenticate钩子逻辑错误:钩子默认包含3个参数,原函数仅接收1个;验证通过时错误创建新WP_User对象,验证失败逻辑覆盖了正常登录流程- 结果存储时机错误:渲染表单时就错误存储用户输入值,未等到提交阶段再获取对比
修复后的完整代码
<?php /** * Plugin Name: m0ri-login-math */ // 在登录页面渲染数学验证输入框 function m0ri_login_math() { // 安全初始化会话,避免重复启动 if (!session_id()) { session_start(); } // 生成随机数并存储正确结果到会话 $randomNumber1 = rand(0, 99); $randomNumber2 = rand(0, 99); $_SESSION['math_correct_result'] = $randomNumber1 + $randomNumber2; ?> <p> <label for="math_result">计算结果:<?php echo $randomNumber1 . ' + ' . $randomNumber2; ?></label><br> <input type="text" name="math_result" id="math_result" class="input" value="" size="20" required> </p> <?php } add_action('login_form', 'm0ri_login_math'); // 处理登录验证逻辑 function m0ri_authenticate_math($user, $username, $password) { // 若用户已通过其他验证(如密码正确),直接返回用户对象 if ($user instanceof WP_User) { return $user; } // 安全初始化会话 if (!session_id()) { session_start(); } // 检查用户是否输入了计算结果 if (!isset($_POST['math_result']) || empty($_POST['math_result'])) { return new WP_Error('math_error', '请输入计算结果'); } // 转换输入值为整数,避免字符串对比误差 $user_input = intval($_POST['math_result']); $correct_result = isset($_SESSION['math_correct_result']) ? intval($_SESSION['math_correct_result']) : -1; // 对比结果是否正确 if ($user_input !== $correct_result) { return new WP_Error('math_error', '计算结果错误,请重新输入'); } // 验证通过后清除会话中的结果,防止重复利用 unset($_SESSION['math_correct_result']); return $user; } // 钩子优先级设为999,确保在默认登录验证之后执行 add_filter('authenticate', 'm0ri_authenticate_math', 999, 3); // 在登录页面显示自定义错误信息 function m0ri_login_math_error_message() { $errors = $GLOBALS['errors']; if ($errors instanceof WP_Error && $errors->get_error_code() === 'math_error') { echo '<div id="login_error">' . $errors->get_error_message('math_error') . '</div>'; } } add_action('login_errors', 'm0ri_login_math_error_message');
修复细节说明
- 会话安全优化:通过
!session_id()判断避免重复启动会话,解决WordPress环境下的会话冲突问题 - 输入获取修正:改用
$_POST获取用户提交的计算结果,符合登录表单的默认提交方式 - 钩子参数完善:接收
authenticate钩子的完整3个参数,优先判断用户是否已通过密码验证,不干扰正常登录流程 - 验证逻辑严谨性:转换输入值为整数避免字符串对比误差,验证通过后清除会话结果防止恶意重复利用
- 错误提示优化:通过
login_errors钩子在登录页面显示自定义的数学验证错误信息,提升用户体验
内容的提问来源于stack exchange,提问作者m0ripper
相关产品推荐
相关产品推荐

