You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

g-recaptcha-response参数校验:重复/空值可提交是否为Google Captcha设计预期

关于Google reCAPTCHA表单可重复提交/空参数提交的问题解答

这种情况不属于Google reCAPTCHA的设计预期,是你的服务端校验逻辑缺失导致的安全漏洞。

问题根因说明

  • Google reCAPTCHA生成的g-recaptcha-response本身是一次性凭证,默认有效期仅为2分钟,且只要被服务端校验过一次就会立即失效,天然不支持重复使用
  • reCAPTCHA的校验逻辑必须在服务端完成:前端获取到的g-recaptcha-response提交到后端后,后端必须主动调用Google的校验接口验证该参数的合法性,不能仅依赖前端做校验限制
  • 你当前出现空参数、重复参数都能提交的问题,核心是后端完全没有对g-recaptcha-response做存在性校验和合法性校验,相当于整个验证码逻辑完全失效

相关请求报文

POST /dev-test/form.php HTTP/1.1
Host:.com
Content-Length: 606
Cache-Control: max-age=0
Sec-Ch-Ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
Sec-Ch-Ua-Mobile: ?0
Upgrade-Insecure-Requests: 1
Origin: https://sample.com
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://sample.com/dev-test/form.php
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Connection: close

client_id=077&first_name=captcha-bypass-2nd-attempt&last_name=bypass-captcha-2nd-attempt&consent=true&g-recaptcha-response=

上述报文中g-recaptcha-response为空也能提交,已经实锤后端没有对该参数做任何校验。

修复方案

  • 第一步:后端接收表单POST请求时,先校验g-recaptcha-response参数是否存在且不为空,空值直接拒绝请求返回错误
  • 第二步:服务端携带接收的g-recaptcha-response、站点对应的reCAPTCHA服务端密钥,请求Google官方校验接口验证参数有效性
  • 第三步:只有校验接口返回成功结果时,才继续处理后续的表单业务逻辑,否则直接拦截请求

内容的提问来源于stack exchange,提问作者yo bakbar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 18:33:04