如何阻止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
相关产品推荐
相关产品推荐

