ReCaptcha V3实现异常:隐身窗口测试表单无验证直接提交
ReCaptcha V3 隐身窗口无验证直接提交问题分析与修复
核心误解澄清
ReCaptcha V3 没有可视化验证挑战,它完全基于后台行为分析给出0.0-1.0的风险分数,不会像V2那样弹出复选框或图片验证界面。你在隐身窗口看到的“直接提交”是V3的正常表现——因为它不需要用户手动完成验证,问题出在你的实现逻辑和后端验证缺失上。
现有代码问题
你的代码写法更接近ReCaptcha V2的自动渲染模式,不符合V3的正确实现流程:
- 没有手动调用
grecaptcha.execute获取验证token - 未将token附加到表单提交数据中,导致后端无法进行风险分数校验
修复步骤(适配Squarespace)
1. 修正客户端代码
将现有代码替换为V3标准实现,确保提交表单前获取并携带验证token:
<script src="https://www.google.com/recaptcha/api.js?render=你的SiteKey"></script> <script> // 等待DOM加载完成再绑定事件 document.addEventListener('DOMContentLoaded', function() { const form = document.getElementById('contactForm'); form.addEventListener('submit', function(e) { e.preventDefault(); // 阻止表单默认提交行为 // 调用V3获取验证token grecaptcha.execute('你的SiteKey', { action: 'submit' }).then(function(token) { // 创建隐藏字段存储token,提交给后端 const tokenInput = document.createElement('input'); tokenInput.type = 'hidden'; tokenInput.name = 'g-recaptcha-response'; tokenInput.value = token; form.appendChild(tokenInput); // 提交表单 form.submit(); }); }); }); </script> <form action="https://你的提交URL" id="contactForm" method="POST" role="form"> <!-- 你的表单字段 --> <button id="submit-form-button" class="btn btn-primary submit" type="submit">ENQUIRE NOW</button> </form>
2. 必须添加后端验证
V3的核心逻辑在后端,你需要在表单接收端执行以下操作:
- 接收表单中的
g-recaptcha-responsetoken - 调用Google的验证接口,传入你的Secret Key和token
- 根据返回的
success状态和score值判断是否允许提交:- 隐身窗口下用户无历史行为,
score通常会低于0.3,此时后端应拒绝提交,或引导用户完成V2验证 - 正常用户的
score一般高于0.5,可允许提交
- 隐身窗口下用户无历史行为,
3. Squarespace平台注意事项
- 脚本放在HTML主体完全没问题,只要确保在DOM加载完成后绑定事件(上述代码已通过
DOMContentLoaded处理) - 如果Squarespace自带表单拦截逻辑,可尝试将代码放在Squarespace的「设置」→「高级」→「代码注入」→「页脚」区域,确保脚本在页面最后加载
若需可视化验证挑战
如果你的需求是让用户手动完成验证(比如隐身窗口下强制触发),请切换到ReCaptcha V2的“我不是机器人”复选框版本,V3本身不支持前端可视化挑战。
内容的提问来源于stack exchange,提问作者j00m
相关产品推荐
相关产品推荐

