///
reCAPTCHA v2 与 v3:哪个版本能提供更好的机器人防护?
Vladlen Vlasov
Vladlen Vlasov
技术撰稿人
March 24, 2026
9 分钟
请查看本网站所提供内容的使用条款。

reCAPTCHA v2 与 v3:哪个版本能提供更好的机器人防护?

generated-image (34).png

如果你正在为自己的网站决定使用 reCAPTCHA v2 还是 v3,那么你权衡的是一个真实的取舍:可见的用户打断与不可见的风险评分。本文将从机器人防护、用户体验和实现方式几个方面拆解 reCAPTCHA v2 与 v3 的差异——并附上完整代码示例——帮助你做出更明智的选择。

robots
立即开始自动化您的工作流 reCAPTCHA v2

什么是 reCAPTCHA v2?

reCAPTCHA v2 由 Google 推出,是大多数用户一眼就能认出的版本:经典的 “I'm not a robot” 复选框。当 Google 的风险信号不够明确时,它会升级为图片网格挑战——要求用户识别消防栓、红绿灯、人行横道等对象。

reCAPTCHA v2 有 两种子版本

  • 复选框版(标准版): 渲染一个可见的小部件。用户点击复选框;Google 会评估鼠标移动、操作时序以及浏览器信号。如果置信度较低,就会出现图片挑战。
  • 隐形版 v2: 没有可见的小部件。挑战会在表单提交时静默触发。只有看起来可疑的用户才会看到挑战。这是在比较 reCAPTCHA v2 隐形版与 v3 时一个很重要的区别(下文会进一步说明)。

 reCAPTCHA v2 与 v3 的区别 从这里就开始了:v2 依赖明确的人类操作,而 v3 则在整个用户会话期间被动收集行为信号。


什么是 reCAPTCHA v3?

reCAPTCHA v3 同样由 Google 开发,并且是完全隐形的。它不会用挑战打断用户。相反,它会在后台持续运行,监测鼠标移动、滚动模式、交互时序和浏览历史等行为信号。在某个定义好的操作节点——如登录、注册、结账——它会返回一个 0.0 到 1.0 的风险评分

  • 1.0 = 极有可能是真人
  • 0.0 = 极有可能是机器人

实用说明: 免费版 reCAPTCHA v3 通常只提供四个风险评分值:0.1、0.3、0.7 和 0.9。在实际使用中,极端值(0.0 和 1.0)很少返回。完整的 11 级评分范围需要将计费账户绑定到 Google Cloud 项目。

关键在于,reCAPTCHA v3 不会 自动拦截请求。你的后端必须解释这个分数并决定如何处理。这正是 reCAPTCHA v3 与 v2 的核心差异:v2 在入口处拦住机器人;v3 负责标记风险,而最终决定权在你手里。


reCAPTCHA v2 与 v3 的差异:机器人防护深度解析

从安全角度理解 Google reCAPTCHA v2 与 v3 的差异,需要观察每个版本分别带来了怎样的攻击面。

reCAPTCHA v2 能立即拦住基础脚本机器人——它们无法点击复选框,也无法在没有专用工具的情况下解开图片网格挑战。不过,它也容易受到以下攻击:

  • 计算机视觉攻击——机器学习模型可以以不同准确率解答图片网格,具体取决于挑战类型和模型复杂度
  • 人工代解服务——第三方平台上的人工通常可以以较低的单次费用完成挑战
  • 令牌重放攻击——如果服务端验证缺失或薄弱,攻击者就可能在多次请求中复用一个有效令牌

reCAPTCHA v3 则改变了检测模型。由于它会分析整个会话过程中的行为,因此可以发现那些只在单个挑战点上模仿人类交互的复杂机器人。不过,它的弱点包括:

  • 没有硬性拦截——如果攻击者了解你的评分阈值,就可能逐步调整请求,使其长期维持在阈值之上
  • 误报——使用 VPN、Tor 出口节点或注重隐私浏览器的正常用户,可能获得较低评分并被错误拦截
  • 阈值调优负担——你必须为网站做好监测、收集数据并校准阈值,而这需要持续维护

这两个版本都不能保证绝对防住机器人。对于高风险场景,把两者叠加使用——以 v3 作为主信号,在低分情况下回退到 v2 挑战——通常被认为是一种最佳实践的混合策略。


用户体验对比——用户打断 vs. 隐形运行

Google reCAPTCHA v2 与 v3 在用户体验上的差距很明显。reCAPTCHA v2 会在关键转化节点引入可见的用户打断。图片网格挑战在移动设备上尤其令人困扰,对视障用户也不友好;而且如果没有音频替代方案,纯图片挑战还可能与 WCAG 无障碍指南发生冲突。这意味着 v2 可能会对转化率产生实际影响,尤其是在面向消费者的表单中。

在比较 reCAPTCHA v2 隐形版与 v3 时:两者对大多数用户来说都是隐藏的,但它们处理边缘情况的方式不同。隐形版 v2 在置信度较低时会回退为挑战——因此注重隐私的用户仍可能看到图片网格。v3 则永远不会显示挑战——它只会把风险评分返回给你的后端,再由后端决定如何响应。如果你的后端配置为拒绝低于某个阈值的请求,用户可能会发现自己的操作被悄悄拒绝,却没有任何解释。尽管 v3 本身并不会直接拦截任何人,但这种体验依然可能令人沮丧:真正的拦截决定始终由你的服务器逻辑作出。

无障碍说明:

  • v2 复选框版: 通过键盘导航具备中等程度的无障碍支持;如果没有音频替代方案,图片网格对屏幕阅读器用户仍然较难使用
  • v2 隐形版: 无障碍性更好,因为大多数用户根本不会看到挑战
  • v3: 无障碍基础最好,因为它从不显示挑战;不过,对于误报导致的静默拦截,必须提供清晰透明的回退路径(例如邮件验证)

reCAPTCHA v2 与 v3——功能对比

功能

reCAPTCHA v2(复选框版)

reCAPTCHA v2(隐形版)

reCAPTCHA v3

用户交互

点击复选框 + 可能出现图片网格

大多数用户无需交互;可疑时触发挑战

无——完全隐形

机器人检测方式

浏览器信号 + 挑战响应

浏览器信号 + 挑战回退

跨整个会话的行为评分

输出结果

通过 / 失败令牌

通过 / 失败令牌

每个操作对应一个评分(0.0–1.0)

误报风险

低–中

低–中

中–高(针对 VPN/隐私用户)

对残障用户的无障碍性

中等(图片网格可能存在问题)

更好

最好(不会显示挑战)

对用户造成的打断

后端复杂度

低(验证令牌)

低(验证令牌)

更高(解释评分 + 定义动作)

隐私影响

中等

中等

通常更高(持续跟踪整个会话)

最适用场景

高风险表单、登录、支付

中风险表单

持续监控、多操作流程


robots
立即开始自动化您的工作流 reCAPTCHA v2

何时使用 reCAPTCHA v2 或 v3

回答 reCAPTCHA v2 与 v3 哪个更好,完全取决于你的具体场景。没有哪个版本在所有情况下都绝对更优。

在以下情况下选择 reCAPTCHA v2:

  • 表单属于高风险场景(登录、支付、创建账户),而明确的用户确认具有实际价值
  • 你希望后端逻辑尽可能简单——只验证令牌,不解释分数
  • 你的用户群对用户打断不那么敏感(如 B2B 工具、管理后台)
  • 你需要为未通过 v3 评分检查的用户提供一个可强制拦截的回退挑战

在以下情况下选择 reCAPTCHA v3:

  • 用户体验和转化率是优先事项(电商、落地页、SaaS 入门引导)
  • 你希望在不打断用户的情况下保护页面上的多个操作
  • 你的后端具备解释分数并应用分层响应的能力(允许 / 挑战 / 拦截)
  • 你希望在整个用户会话期间获得被动式的机器人情报

推荐的混合方案:

  1. 在所有受保护的操作中部署 v3
  2. 如果某个用户的分数低于你的阈值(例如低于 0.5),则展示一个隐形版 v2 挑战
  3. 如果这一步也失败,则拦截或转入人工审核

这将 v3 的流畅用户体验与 v2 的强制拦截能力结合了起来。


实现指南——reCAPTCHA v2

第 1 步:注册你的 site key

前往 Google 的 reCAPTCHA 管理控制台,选择 reCAPTCHA v2(“I'm not a robot” Checkbox),然后添加你的域名。你会收到一个 site key(公开)和一个 secret key(私密——仅限服务器使用,绝不要暴露在客户端)。

第 2 步:前端——Checkbox 小部件

<!DOCTYPE html> 
<html> 
<head> 
  <title>reCAPTCHA v2 演示</title> 
  <script src="https://www.google.com/recaptcha/api.js" async defer></script> 
</head> 
<body> 
  <form action="/submit" method="POST"> 
    <input type="text" name="email" placeholder="你的邮箱" required /> 
    <div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div> 
    <br/> 
    <input type="submit" value="提交"> 
  </form> 
</body> 
</html>

第 3 步:前端——隐形版 v2 变体

<!DOCTYPE html> 
<html> 
<head> 
  <title>reCAPTCHA v2 隐形版演示</title> 
  <script src="https://www.google.com/recaptcha/api.js" async defer></script> 
  <script> 
    function onSubmit(token) { 
      document.getElementById("demo-form").submit(); 
    } 
  </script> 
</head> 
<body> 
  <form id="demo-form" action="/submit" method="POST"> 
    <input type="text" name="email" placeholder="你的邮箱" required /> 
    <button class="g-recaptcha" 
            data-sitekey="YOUR_SITE_KEY" 
            data-callback="onSubmit" 
            data-badge="bottomright"> 
      提交 
    </button> 
  </form> 
</body> 
</html>

第 4 步:后端验证(PHP)

<?php 
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { 
    http_response_code(405); 
    exit('不允许的请求方法'); 
} 
$token  = $_POST['g-recaptcha-response'] ?? ''; 
$secret = 'YOUR_SECRET_KEY'; 
if (!$token) { 
    exit('缺少 CAPTCHA 令牌。'); 
} 
// 使用 POST 以避免在服务器/代理日志中暴露 secret key 
$postData = http_build_query([ 
    'secret'   => $secret, 
    'response' => $token, 
]); 
$context = stream_context_create([ 
    'http' => [ 
        'method'  => 'POST', 
        'header'  => 'Content-Type: application/x-www-form-urlencoded', 
        'content' => $postData, 
    ], 
]); 
$response = file_get_contents( 
    'https://www.google.com/recaptcha/api/siteverify', 
    false, 
    $context 
); 
if ($response === false) { 
    http_response_code(503); 
    exit('无法连接到 reCAPTCHA 验证服务。'); 
} 
$result = json_decode($response, true); 
if (!empty($result['success'])) { 
    echo "<p>表单提交成功!</p>"; 
} else { 
    http_response_code(403); 
    echo "<p>CAPTCHA 验证失败。请重试。</p>"; 
} 
?>

实现指南——reCAPTCHA v3

第 1 步:注册一个 v3 site key

在 reCAPTCHA 管理控制台中,选择 reCAPTCHA v3。你会收到一套与任何 v2 key 分开的密钥——不要在不同版本之间混用。

第 2 步:前端——以编程方式执行令牌

<!DOCTYPE html> 
<html> 
<head> 
  <title>reCAPTCHA v3 演示</title> 
  <script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script> 
</head> 
<body> 
  <form id="login-form"> 
    <input type="email" name="email" placeholder="邮箱" required /> 
    <input type="password" name="password" placeholder="密码" required /> 
    <button type="button" onclick="submitWithRecaptcha()">登录</button> 
  </form> 
  <script> 
    async function submitWithRecaptcha() { 
      // 令牌会在 2 分钟后过期——请在提交前立即执行 
      const token = await new Promise((resolve) => { 
        grecaptcha.ready(() => { 
          grecaptcha.execute('YOUR_SITE_KEY', { action: 'login' }).then(resolve); 
        }); 
      }); 
      const response = await fetch('/api/login', { 
        method: 'POST', 
        headers: { 'Content-Type': 'application/json' }, 
        body: JSON.stringify({ 
          email: document.querySelector('[name="email"]').value, 
          recaptchaToken: token 
        }) 
      }); 
      const data = await response.json(); 
      if (data.ok) { 
        alert('登录成功!'); 
      } else { 
        alert('验证失败:' + (data.error || '未知错误')); 
      } 
    } 
  </script> 
</body> 
</html>

第 3 步:后端验证(Node.js / Express)

// Node.js 18+ 与 Express 
import express from 'express'; 
const app = express(); 
app.use(express.json()); 
app.post('/api/login', async (req, res) => { 
  const { recaptchaToken } = req.body; 
  const params = new URLSearchParams(); 
  params.set('secret', process.env.RECAPTCHA_SECRET); 
  params.set('response', recaptchaToken); 
  try { 
    const verifyRes = await fetch('https://www.google.com/recaptcha/api/siteverify', { 
      method: 'POST', 
      headers: { 'content-type': 'application/x-www-form-urlencoded' }, 
      body: params 
    }); 
    const data = await verifyRes.json(); 
    if (!data.success) { 
      return res.status(403).json({ error: 'recaptcha_failed', codes: data['error-codes'] }); 
    } 
    // 始终验证 action 是否与预期一致 
    if (data.action !== 'login') { 
      return res.status(403).json({ error: 'recaptcha_action_mismatch' }); 
    } 
    // 0.5 是 Google 推荐的初始阈值——请根据你的实际流量进行调优 
    if (data.score < 0.5) { 
      return res.status(403).json({ error: 'recaptcha_low_score', score: data.score }); 
    } 
    return res.json({ ok: true }); 
  } catch (err) { 
    return res.status(503).json({ error: 'recaptcha_service_unavailable' }); 
  } 
}); 
app.listen(3000, () => console.log('服务器正在 3000 端口运行'));

使用 CapMonster Cloud 自动化求解 reCAPTCHA

在构建测试自动化、QA 流水线或已授权的网页抓取工作流时,你需要一种能够以编程方式处理 reCAPTCHA 挑战的方法——而不是每次 CAPTCHA 出现时都让整套测试中断。 CapMonster Cloud 是一项自动化 CAPTCHA 求解服务,同时支持 reCAPTCHA v2 和 v3,并提供基于令牌的 API,可顺畅集成到任何技术栈中。

重要说明: CapMonster Cloud 仅适用于你已获得授权访问的网站和平台——用于测试、QA 自动化以及已授权的抓取工作流。

通过 CapMonster Cloud API 求解 reCAPTCHA v2

创建任务请求:

POST https://api.capmonster.cloud/createTask

{ 
  "clientKey": "YOUR_API_KEY", 
  "task": { 
    "type": "RecaptchaV2Task", 
    "websiteURL": "https://example.com/login", 
    "websiteKey": "YOUR_SITE_KEY" 
  } 
}

响应

{ 
  "errorId":0, 
  "taskId":407533072 
}

轮询结果:

POST https://api.capmonster.cloud/getTaskResult

{ 
  "clientKey": "YOUR_API_KEY", 
  "taskId": 407533072 
}

响应(准备就绪时):

{ 
  "errorId": 0, 
  "status": "ready", 
  "solution": { 
    "gRecaptchaResponse": "03AFcWeA66ZARdA5te7ac..." 
  } 
}

通过 CapMonster Cloud API 求解 reCAPTCHA v3

POST https://api.capmonster.cloud/createTask

{ 
  "clientKey": "YOUR_API_KEY", 
  "task": { 
    "type": "RecaptchaV3TaskProxyless", 
    "websiteURL": "https://example.com/login", 
    "websiteKey": "YOUR_SITE_KEY",
    "isEnterprise": false, 
    "minScore": 0.7, 
    "pageAction": "login" 
  } 
}

后续步骤与 v2 类似。

SDK 示例(Python — reCAPTCHA v3)

# https://github.com/CapMonsterCloud/capmonstercloud-client-python

import asyncio 
from capmonstercloudclient import CapMonsterClient, ClientOptions 
from capmonstercloudclient.requests import RecaptchaV3ProxylessRequest 
client_options = ClientOptions(api_key="YOUR_API_KEY")  # 指定你的 CapMonster Cloud API key 
cap_monster_client = CapMonsterClient(options=client_options) 
# 你也可以选择检查余额 
balance = asyncio.run(cap_monster_client.get_balance()) 
print("余额:", balance) 
recaptcha_v3_request = RecaptchaV3ProxylessRequest( 
    websiteUrl="https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta",  # 含有 captcha 的页面 URL 
    websiteKey="6Le0xVgUAAAAAIt20XEB4rVhYOODgTl00d8juDob", 
    minScore=0.6, 
    pageAction="myverify" 
) 
async def solve_captcha(): 
    return await cap_monster_client.solve_captcha(recaptcha_v3_request) 
responses = asyncio.run(solve_captcha()) 
print(responses)

SDK 示例(Node.js — reCAPTCHA v2)

// https://github.com/CapMonsterCloud/capmonstercloud-client-js

import { CapMonsterCloudClientFactory, ClientOptions, RecaptchaV2Request } from '@zennolab_com/capmonstercloud-client'; 
const API_KEY = "YOUR_API_KEY";  // 指定你的 CapMonster Cloud API key 
async function solveRecaptchaV2() { 
    const client = CapMonsterCloudClientFactory.Create( 
        new ClientOptions({ clientKey: API_KEY }) 
    ); 
    // 不使用代理的基础示例 
    // CapMonster Cloud 会自动使用它自己的代理 
    let recaptcha2Request = new RecaptchaV2Request({ 
        websiteURL: "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high", 
        websiteKey: "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd" 
    }); 
    // 使用你自己的代理的示例 
    // 如果你想使用自己的代理,请取消注释此代码块 
    /* 
    const proxy = { 
        proxyType: "http", 
        proxyAddress: "123.45.67.89", 
        proxyPort: 8080, 
        proxyLogin: "username", 
        proxyPassword: "password" 
    }; 
    recaptcha2Request = new RecaptchaV2Request({ 
        websiteURL: "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high", 
        websiteKey: "6Lcg7CMUAAAAANphynKgn9YAgA4tQ2KI_iqRyTwd", 
        proxy, 
        userAgent: "userAgentPlaceholder" 
    }); 
    */ 
    // 你也可以选择检查余额 
    const balance = await client.getBalance(); 
    console.log("余额:", balance); 
    const result = await client.Solve(recaptcha2Request); 
    console.log("求解结果:", result); 
} 
solveRecaptchaV2().catch(console.error);

CapMonster Cloud 还支持 reCAPTCHA Enterprise、Cloudflare Turnstile 以及多种其他 CAPTCHA 类型——因此,对于任何需要与受 CAPTCHA 保护表单交互的测试基础设施来说,它都是一种很灵活的工具。


robots
立即开始自动化您的工作流 reCAPTCHA v2

实现清单

reCAPTCHA v2

  1. 在 Google reCAPTCHA 管理控制台中注册一个 v2 site key
  2. 将 api.js 脚本以 async defer 的方式添加到你的页面
  3. 使用 <div data-sitekey="..."> 渲染小部件(复选框版),或使用 data-callback 配置隐形版
  4. 在服务器端从 POST 请求体中提取 g-recaptcha-response
  5. 使用你的 secret key 通过 POST(不是 GET)在 https://www.google.com/recaptcha/api/siteverify 验证令牌,以防 secret key 被记录到日志中
  6. 在处理表单提交之前,检查是否返回了 success: true
  7. 绝不要在客户端代码中暴露你的 secret key
  8. 为无障碍访问提供音频挑战替代方案

reCAPTCHA v3

  1. 单独注册一个 v3 site key(不要复用 v2 key)
  2. 加载 api.js?render=YOUR_SITE_KEY
  3. 对每个受保护的操作调用 grecaptcha.execute(siteKey, { action: 'your_action' })
  4. 立即将令牌发送到后端——令牌会在 2 分钟后过期,且只能使用一次
  5. 通过 siteverify 进行验证,检查 success: true,并确认 action 与预期值一致
  6. 设置初始分数阈值(0.5 是 Google 推荐的起点),并根据真实流量分析进行调整
  7. 为每个分数区间定义分层响应:允许 / 追加挑战 / 拦截
  8. 持续记录分数以检测漂移并调整阈值
  9. 为那些并无过错却得到低分的用户提供透明的回退路径(例如邮件验证)

常见问题

问:reCAPTCHA v3 比 v2 更好吗? 并不绝对。reCAPTCHA v3 提供了更好的用户体验,但它需要明显更多的后端工作,并且会给使用 VPN 或注重隐私浏览器的正常用户带来误报风险。v2 更容易部署,并且能在表单层面提供硬性拦截。对于高安全性表单,许多团队会将两者组合使用——以 v3 作为第一层,v2 作为回退方案。

问:从用户体验的角度看,reCAPTCHA v2 和 v3 有什么区别? v2(复选框版)需要用户进行一次可见操作,并且可能升级为图片挑战。v3 则是完全隐形的——用户永远不会直接与它交互。不过,v3 可能返回低分,从而静默拦截正常用户,这是一种不同但同样真实的用户打断,尤其是在用户根本不知道自己的操作为何被拒绝的情况下。

问:我可以同时使用 reCAPTCHA v2 和 v3 吗? 可以,而且在高风险场景下这是推荐做法。使用 v3 作为主层,对所有用户进行被动评分;然后对那些 v3 分数低于你阈值的用户展示一个 v2 挑战(可见或隐形)。这就是上文实现部分所介绍的混合方案。

问:我应该为 reCAPTCHA v3 设置什么阈值? Google 推荐以 0.5 作为起点。合适的阈值取决于你的流量模式——在最终确定数值之前,应先分析真实用户的分数分布。阈值设得过高可能会误拦正常用户;设得过低则可能让机器人通过。支付或密码重置等高风险操作,可能需要更高的阈值。

问:reCAPTCHA v2 隐形版和 v3 有什么区别? 两者对大多数用户来说都是隐藏的,但工作方式不同。隐形版 v2 仍然有挑战回退——可疑用户可能会看到图片网格。v3 则完全不会显示任何挑战;它只返回一个分数。最关键的实际区别在于:隐形版 v2 仍然通过挑战保留了硬性拦截机制,而 v3 则把所有拦截决定完全交给你的后端逻辑。


结论

在 reCAPTCHA v2 与 v3 之间做选择,本质上取决于两个变量:你能接受多少用户打断,以及你愿意在后端投入多少复杂度。v2 提供了一个简单、成熟且几乎无需额外配置的防护门;v3 则提供更细腻、隐形的智能判断,但需要主动解释结果并持续调整阈值。对于大多数生产环境网站来说,最稳健的方式是将两者结合使用。

准备好测试你的 CAPTCHA 集成了吗? 立即试用 CapMonster Cloud →——通过简洁的 API 以及 Python、JavaScript 和 C# 的官方 SDK,在你的 QA 和测试工作流中自动化处理 reCAPTCHA v2 和 v3 的求解。


NB: 请注意,本产品仅用于对您自身的网站以及您依法拥有访问权限的资源进行自动化测试
ItGuy
geear
面向软件开发者的联盟计划
通过用户识别验证码的消费获取高达 30% 的返佣。
✅ 请求已发送
感谢您对我们的合作伙伴计划感兴趣!我们将在 7 个工作日内与您联系。
请求加入
填写表格以提交申请加入合作伙伴计划。
更多文章