零基础开发求助:如何让reCaptcha验证码正常校验生效?
reCaptcha验证码绕过问题修复
问题原因
你现有代码的if条件存在语法逻辑错误:将验证码结果判断和发邮件函数错误拼接,导致验证码校验逻辑完全没有生效,只要邮件函数可执行就会直接进入提交成功分支,完全绕过了验证码判断。
修复逻辑
需要按顺序执行三步判断,不能把不同逻辑混写在同一个if条件里:
- 第一步先判断用户有没有提交验证码响应参数,没提交就说明用户没勾选验证码,直接返回对应提示
- 第二步调用验证码校验方法,拿到校验结果
- 第三步只有验证码校验通过时,才执行发邮件逻辑,校验失败返回验证错误提示
修正后可直接使用的代码
// 读取前端提交的验证码参数,不存在则默认置为空 $captchaResp = $_POST['g-recaptcha-response'] ?? ''; // 未携带验证码参数=用户没勾选验证,直接返回提示终止流程 if (empty($captchaResp)) { echo "<h1>提交失败</h1>"; echo "<fieldset>"; echo "<div id='error_page'>"; echo "<p>请先勾选人机验证选项后再提交表单</p>"; echo "</div>"; echo "</fieldset>"; exit; } // 执行验证码校验 $checkResult = CheckCaptcha($captchaResp); // 校验通过才执行发邮件操作 if ($checkResult['success'] === true) { // 调用发邮件方法 $sendStatus = mail($address, $e_subject, $msg, $headers); if ($sendStatus) { echo "<h1>Captcha verified</h1>"; echo "<fieldset>"; echo "<div id='success_page'>"; echo "<h1>Email Sent Successfully.</h1>"; echo "</div>"; echo "</fieldset>"; } else { echo "<h1>提交失败</h1><p>邮件发送服务异常,请稍后重试</p>"; } } else { echo "<h1>验证失败</h1>"; echo "<fieldset>"; echo "<div id='error_page'>"; echo "<p>人机验证未通过,请重新完成验证后提交</p>"; echo "</div>"; echo "</fieldset>"; }
额外注意
要保证验证码功能完全生效,前端页面必须正确加载reCaptcha组件,提交表单时才会自动带上
g-recaptcha-response参数;另外你自定义的CheckCaptcha方法内部需要正确携带站点密钥、用户IP、验证码响应值向校验接口发起请求,不能直接返回固定的成功结果。
内容的提问来源于stack exchange,提问作者TomTom
相关产品推荐
相关产品推荐

