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

集成reCAPTCHA V2后仍遭垃圾信息侵扰的技术咨询

解决reCAPTCHA V2仍无法阻止垃圾表单提交的问题

看起来你遇到的是reCAPTCHA V2被垃圾机器人绕过的典型问题——很多人以为只要前端加了验证框、后端检查字段非空就够了,但实际上机器人很容易伪造一个非空的响应值。咱们一步步来排查和修复:

1. 最关键:补全后端的reCAPTCHA有效性验证

你的代码目前只检查了g-recaptcha-response字段是否为空,但没有主动调用Google的验证API去确认这个响应是真实有效的。这是核心漏洞!机器人可以随便传一个非空字符串绕过你的检查,你必须让后端向Google验证这个响应的合法性。

补全后的代码示例:

// 你的现有代码:检查字段非空后
} elseif($_POST["g-recaptcha-response"]=="") { 
    $message="Please verify that you are human."; 
} else { 
    $secret = "你的服务器端密钥"; // 注意:必须是控制台里的Server Key,不是Site Key
    $data = array( 
        'secret' => $secret, 
        'response' => $_POST["g-recaptcha-response"],
        'remoteip' => $_SERVER['REMOTE_ADDR'] // 可选:加上提交者IP,提升验证准确性
    ); 

    $url = 'https://www.google.com/recaptcha/api/siteverify';
    $options = array(
        'http' => array(
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data)
        )
    );
    $context  = stream_context_create($options);
    $response = file_get_contents($url, false, $context);
    $result = json_decode($response);

    // 检查验证结果
    if (!$result->success) {
        $message = "reCAPTCHA verification failed. Please try again.";
        // 可选:记录错误码,方便排查问题
        // error_log('reCAPTCHA error: ' . implode(', ', $result->error_codes));
    } else {
        // 验证通过,这里处理表单提交逻辑(比如发送邮件)
        // ...你的现有提交代码...
    }
}

2. 检查reCAPTCHA配置是否正确

  • 确认$secret使用的是服务器端密钥(Server Key),而不是客户端的站点密钥(Site Key)——这两个密钥不能混用,很多人会搞混。
  • 登录Google reCAPTCHA控制台,检查你添加的域名是否和网站域名完全匹配(包括HTTP/HTTPS、子域名),如果域名不匹配,真实用户的验证也会失败,但机器人可能通过伪造请求绕过。

3. 考虑升级到reCAPTCHA V3

V2的复选框式验证现在已经被不少先进的垃圾机器人破解了,V3采用无交互的行为分析模式,会给每个用户的行为打分(0-1分),你可以设置一个阈值(比如0.5),低于分数的请求直接拒绝。这种方式对用户更友好,同时防垃圾效果更好。

4. 额外的辅助防护措施

即使做好了reCAPTCHA验证,也可以加一些额外的小手段提升防护:

  • 蜜罐字段:在表单里添加一个隐藏的输入框(用CSS设置display: none),正常用户看不到不会填写,机器人会自动填充。后端检查如果这个字段有值,直接拒绝提交:
    <input type="text" name="honeypot" style="display: none; visibility: hidden;">
    
    后端检查:
    if (!empty($_POST['honeypot'])) {
        // 判定为机器人,直接终止处理
        exit;
    }
    
  • 限制提交频率:用Session或数据库记录用户IP的提交时间,比如同一个IP在1分钟内只能提交一次。
  • 内容过滤:对表单的留言内容做简单检查,比如如果包含大量链接、重复关键词,直接拒绝提交。

内容的提问来源于stack exchange,提问作者M. Salman Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:03:54