ReCaptcha仅点击验证时生效,未验证提交表单仍可通过问题咨询
解决ReCaptcha未验证仍可提交表单的问题
嘿,我懂你遇到的这个坑——ReCaptcha看起来在用户点验证时正常,但直接提交表单居然能绕过去对吧?这其实是个很常见的误区:前端的ReCaptcha交互只是给用户看的,真正的校验必须在后端完成,毕竟前端的限制太容易被绕过了(比如用浏览器控制台改DOM、直接发POST请求)。
下面针对你的PHP场景,给你具体的修复方案:
1. 后端必须做ReCaptcha服务器端校验
这是核心中的核心,只有通过Google官方API验证用户的ReCaptcha令牌,才能确认用户真的完成了验证。
具体步骤:
- 先获取表单提交的ReCaptcha令牌:
$_POST['g-recaptcha-response'](这是ReCaptcha自动生成的隐藏字段值) - 用你的服务器端ReCaptcha密钥(别用客户端密钥!),向Google的验证API发送POST请求
- 解析返回的响应,只有当
success字段为true时,才处理表单数据,否则直接拒绝提交
示例修复代码:
<?php // 替换成你自己的服务器端ReCaptcha密钥 $secretKey = "你的服务器端密钥"; // 获取表单提交的ReCaptcha令牌,为空则直接判定未验证 $responseToken = $_POST['g-recaptcha-response'] ?? ''; // 获取用户的IP地址,可选但能提升验证准确性 $userIp = $_SERVER['REMOTE_ADDR']; // 向Google发送验证请求 $verifyApiUrl = "https://www.google.com/recaptcha/api/siteverify"; $postData = http_build_query([ 'secret' => $secretKey, 'response' => $responseToken, 'remoteip' => $userIp ]); // 发起POST请求 $context = stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => $postData ] ]); $verifyResult = file_get_contents($verifyApiUrl, false, $context); $response = json_decode($verifyResult); // 只有验证通过才处理表单 if ($response && $response->success) { echo "Olá, " . $_POST["name"] . " (" . $_POST["email"] . "), obrigado por enviar seu formulário!"; // 这里可以添加保存数据、发送邮件等业务逻辑 } else { // 验证失败,返回提示并重新显示表单 echo "Por favor, complete o ReCaptcha para enviar o formulário!"; // 此处可以回显你的表单HTML代码 } ?>
2. 前端优化(可选,提升用户体验)
为了减少用户误操作,你可以在前端禁用提交按钮,直到用户完成ReCaptcha验证:
<!-- 假设你的提交按钮ID是submitBtn --> <script> function onCaptchaCompleted() { document.getElementById('submitBtn').disabled = false; } </script> <!-- 在ReCaptcha组件中添加回调函数 --> <div class="g-recaptcha" data-sitekey="你的客户端密钥" data-callback="onCaptchaCompleted"></div> <button id="submitBtn" disabled>Enviar</button>
要记住:前端优化只是提升体验,后端校验才是安全屏障——哪怕前端被绕过,后端的校验也能牢牢挡住恶意提交。
内容的提问来源于stack exchange,提问作者Danilo Quintiliano
相关产品推荐
相关产品推荐

