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

如果你正在为自己的网站决定使用 reCAPTCHA v2 还是 v3,那么你权衡的是一个真实的取舍:可见的用户打断与不可见的风险评分。本文将从机器人防护、用户体验和实现方式几个方面拆解 reCAPTCHA v2 与 v3 的差异——并附上完整代码示例——帮助你做出更明智的选择。
什么是 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/隐私用户) |
对残障用户的无障碍性 | 中等(图片网格可能存在问题) | 更好 | 最好(不会显示挑战) |
对用户造成的打断 | 高 | 低 | 无 |
后端复杂度 | 低(验证令牌) | 低(验证令牌) | 更高(解释评分 + 定义动作) |
隐私影响 | 中等 | 中等 | 通常更高(持续跟踪整个会话) |
最适用场景 | 高风险表单、登录、支付 | 中风险表单 | 持续监控、多操作流程 |
何时使用 reCAPTCHA v2 或 v3
回答 reCAPTCHA v2 与 v3 哪个更好,完全取决于你的具体场景。没有哪个版本在所有情况下都绝对更优。
在以下情况下选择 reCAPTCHA v2:
- 表单属于高风险场景(登录、支付、创建账户),而明确的用户确认具有实际价值
- 你希望后端逻辑尽可能简单——只验证令牌,不解释分数
- 你的用户群对用户打断不那么敏感(如 B2B 工具、管理后台)
- 你需要为未通过 v3 评分检查的用户提供一个可强制拦截的回退挑战
在以下情况下选择 reCAPTCHA v3:
- 用户体验和转化率是优先事项(电商、落地页、SaaS 入门引导)
- 你希望在不打断用户的情况下保护页面上的多个操作
- 你的后端具备解释分数并应用分层响应的能力(允许 / 挑战 / 拦截)
- 你希望在整个用户会话期间获得被动式的机器人情报
推荐的混合方案:
- 在所有受保护的操作中部署 v3
- 如果某个用户的分数低于你的阈值(例如低于 0.5),则展示一个隐形版 v2 挑战
- 如果这一步也失败,则拦截或转入人工审核
这将 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/Zennolab/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/ZennoLab/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 保护表单交互的测试基础设施来说,它都是一种很灵活的工具。
实现清单
reCAPTCHA v2
- 在 Google reCAPTCHA 管理控制台中注册一个 v2 site key
- 将 api.js 脚本以 async defer 的方式添加到你的页面
- 使用 <div data-sitekey="..."> 渲染小部件(复选框版),或使用 data-callback 配置隐形版
- 在服务器端从 POST 请求体中提取 g-recaptcha-response
- 使用你的 secret key 通过 POST(不是 GET)在 https://www.google.com/recaptcha/api/siteverify 验证令牌,以防 secret key 被记录到日志中
- 在处理表单提交之前,检查是否返回了 success: true
- 绝不要在客户端代码中暴露你的 secret key
- 为无障碍访问提供音频挑战替代方案
reCAPTCHA v3
- 单独注册一个 v3 site key(不要复用 v2 key)
- 加载 api.js?render=YOUR_SITE_KEY
- 对每个受保护的操作调用 grecaptcha.execute(siteKey, { action: 'your_action' })
- 立即将令牌发送到后端——令牌会在 2 分钟后过期,且只能使用一次
- 通过 siteverify 进行验证,检查 success: true,并确认 action 与预期值一致
- 设置初始分数阈值(0.5 是 Google 推荐的起点),并根据真实流量分析进行调整
- 为每个分数区间定义分层响应:允许 / 追加挑战 / 拦截
- 持续记录分数以检测漂移并调整阈值
- 为那些并无过错却得到低分的用户提供透明的回退路径(例如邮件验证)
常见问题
问: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 的求解。






