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

如何阻止WordPress中Bot触发SMS OTP钩子?无需额外依赖

解决方案:避免Bot触发WordPress SMS OTP发送

针对邮件链接被Slack等平台Bot爬取触发自动OTP的问题,以下是几种无需额外库/Composer的可靠方案:

方案1:使用WordPress内置的is_bot()函数拦截Bot

WordPress核心自带is_bot()函数,已经维护了主流爬虫/机器人的识别规则,比手动维护User-Agent列表更可靠。直接在发送OTP的逻辑前添加判断:

// 仅当访问者不是Bot时,才发送SMS OTP
if (!is_bot()) {
    // 你的SMS OTP发送逻辑
    send_sms_otp($user_id);
}

该函数会自动识别常见的社交平台Bot(包括Slackbot、Facebook External Hit、Twitterbot等),无需手动更新规则。

方案2:将自动发送改为用户手动触发

取消页面加载时自动发送OTP的逻辑,改为让用户点击按钮主动触发发送。Bot只会被动爬取页面,不会模拟用户点击操作,从根源避免误触发:

// 在验证页面模板中添加表单和处理逻辑
if (isset($_POST['send_otp'])) {
    // 验证WordPress nonce防止CSRF攻击
    if (wp_verify_nonce($_POST['otp_nonce'], 'send_otp_action')) {
        // 获取当前待验证用户ID(可从邮件链接的token中解析)
        $user_id = get_user_id_from_verification_token($_GET['token']);
        // 发送SMS OTP
        send_sms_otp($user_id);
        echo '<div class="notice notice-success">验证码已发送至您的手机号</div>';
    } else {
        echo '<div class="notice notice-error">请求无效,请重试</div>';
    }
}
?>

<form method="post" class="otp-verification-form">
    <?php wp_nonce_field('send_otp_action', 'otp_nonce'); ?>
    <button type="submit" name="send_otp" class="button button-primary">获取SMS验证码</button>
</form>

方案3:结合Cookie验证用户真实交互

页面加载时先设置一个Cookie,只有当用户主动触发操作(如点击按钮)且携带该Cookie时,才发送OTP。Bot通常不会保存和携带Cookie,也不会模拟交互:

// 页面初始化时设置交互Cookie
if (!isset($_COOKIE['otp_interaction'])) {
    setcookie(
        'otp_interaction',
        'valid',
        time() + 1800, // 有效期30分钟
        COOKIEPATH,
        COOKIE_DOMAIN,
        is_ssl()
    );
}

// 处理OTP发送请求
if (isset($_POST['trigger_otp']) && isset($_COOKIE['otp_interaction'])) {
    if (wp_verify_nonce($_POST['otp_nonce'], 'trigger_otp')) {
        $user_id = get_user_id_from_verification_token($_GET['token']);
        send_sms_otp($user_id);
    }
}

方案4:给邮件链接添加一次性Token,仅在用户提交OTP时触发发送

邮件链接携带唯一的验证Token(如https://your-site.com/verify?token=xxx),页面加载时仅显示OTP输入框,当用户输入手机号并提交时,再验证Token有效性并发送OTP:

// 处理OTP提交请求
if (isset($_POST['verify_otp'])) {
    $token = sanitize_text_field($_GET['token']);
    $user_id = validate_verification_token($token);
    
    if ($user_id && wp_verify_nonce($_POST['otp_nonce'], 'verify_otp_action')) {
        // 发送OTP
        send_sms_otp($user_id);
        // 显示OTP输入框用于验证
        echo '<input type="text" name="otp_code" placeholder="请输入验证码">';
        echo '<button type="submit" name="confirm_otp">验证登录</button>';
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:45:24