reCaptcha v3仅实现按钮自动绑定仍遭垃圾信息,求最小配置
问题解答
你的理解确实有误——reCaptcha v3仅完成客户端配置完全起不到防垃圾的作用,服务端验证是核心必做步骤,跳过它的话,垃圾机器人可以直接绕过前端逻辑提交表单,自然会持续收到垃圾信息。
reCaptcha v3 最小有效配置
客户端部分(你已完成的部分补充确认)
- 引入官方脚本并传入站点密钥:
<script src="https://www.google.com/recaptcha/api.js?render=你的站点密钥"></script> - 绑定表单提交动作,生成验证令牌并嵌入表单:
grecaptcha.ready(function() { // action建议设为和表单相关的标识,比如"contact_submit",要和服务端验证时对应 grecaptcha.execute('你的站点密钥', {action: 'contact_submit'}).then(function(token) { // 把令牌放到表单隐藏字段,随表单一起提交到后端 document.querySelector('input[name="g-recaptcha-response"]').value = token; }); }); - 表单中需添加隐藏字段存储令牌:
<input type="hidden" name="g-recaptcha-response">
服务端部分(你缺失的核心步骤)
这一步是拦截垃圾的关键,必须在后端完成:
- 接收表单提交的
g-recaptcha-response令牌,使用服务端密钥(注意和前端站点密钥区分,绝对不能暴露在前端)向Google验证API发起请求:// ASP.NET 示例代码 string recaptchaToken = Request.Form["g-recaptcha-response"]; string secretKey = "你的服务端密钥"; using var client = new HttpClient(); var verifyResponse = await client.GetAsync( $"https://www.google.com/recaptcha/api/siteverify?secret={secretKey}&response={recaptchaToken}" ); string verifyResultJson = await verifyResponse.Content.ReadAsStringAsync(); - 解析返回的JSON结果,重点检查三个核心字段:
success:是否验证通过score:用户行为风险评分(0-1,分数越低越可能是机器人)action:需和客户端设置的action一致,防止令牌被复用
- 根据验证结果决定是否处理表单:
// 定义解析JSON的实体类 public class RecaptchaVerifyResult { public bool Success { get; set; } public float Score { get; set; } public string Action { get; set; } } var verifyResult = JsonSerializer.Deserialize<RecaptchaVerifyResult>(verifyResultJson); // 建议设置合理的分数阈值,比如0.5,可根据垃圾情况调整 if (!verifyResult.Success || verifyResult.Score < 0.5 || verifyResult.Action != "contact_submit") { // 验证失败,拒绝提交并返回提示 ModelState.AddModelError(string.Empty, "验证失败,请稍后重试"); return View(); } // 验证通过,正常处理表单提交逻辑
补充说明
官方文档里的服务端验证章节并不是可选内容,它是reCaptcha v3生效的核心——客户端仅负责生成验证令牌,真正判断用户是否为机器人的逻辑在Google的验证服务,你的后端必须完成这个验证流程,才能有效拒绝机器人的提交请求。
内容的提问来源于stack exchange,提问作者Tillito
相关产品推荐
相关产品推荐

