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
相关产品推荐
相关产品推荐

