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

自定义认证过滤器钩子失效,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');

修复细节说明

  1. 会话安全优化:通过!session_id()判断避免重复启动会话,解决WordPress环境下的会话冲突问题
  2. 输入获取修正:改用$_POST获取用户提交的计算结果,符合登录表单的默认提交方式
  3. 钩子参数完善:接收authenticate钩子的完整3个参数,优先判断用户是否已通过密码验证,不干扰正常登录流程
  4. 验证逻辑严谨性:转换输入值为整数避免字符串对比误差,验证通过后清除会话结果防止恶意重复利用
  5. 错误提示优化:通过login_errors钩子在登录页面显示自定义的数学验证错误信息,提升用户体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:45:03