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

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

reCAPTCHA v2 由 Google 推出,是大多数用户一眼就能认出的版本:经典的 “I'm not a robot” 复选框。当 Google 的风险信号不够明确时,它会升级为图片网格挑战——要求用户识别消防栓、红绿灯、人行横道等对象。
reCAPTCHA v2 有 两种子版本:
reCAPTCHA v2 与 v3 的区别 从这里就开始了:v2 依赖明确的人类操作,而 v3 则在整个用户会话期间被动收集行为信号。
reCAPTCHA v3 同样由 Google 开发,并且是完全隐形的。它不会用挑战打断用户。相反,它会在后台持续运行,监测鼠标移动、滚动模式、交互时序和浏览历史等行为信号。在某个定义好的操作节点——如登录、注册、结账——它会返回一个 0.0 到 1.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 负责标记风险,而最终决定权在你手里。
从安全角度理解 Google reCAPTCHA v2 与 v3 的差异,需要观察每个版本分别带来了怎样的攻击面。
reCAPTCHA v2 能立即拦住基础脚本机器人——它们无法点击复选框,也无法在没有专用工具的情况下解开图片网格挑战。不过,它也容易受到以下攻击:
reCAPTCHA v3 则改变了检测模型。由于它会分析整个会话过程中的行为,因此可以发现那些只在单个挑战点上模仿人类交互的复杂机器人。不过,它的弱点包括:
这两个版本都不能保证绝对防住机器人。对于高风险场景,把两者叠加使用——以 v3 作为主信号,在低分情况下回退到 v2 挑战——通常被认为是一种最佳实践的混合策略。
Google reCAPTCHA v2 与 v3 在用户体验上的差距很明显。reCAPTCHA v2 会在关键转化节点引入可见的用户打断。图片网格挑战在移动设备上尤其令人困扰,对视障用户也不友好;而且如果没有音频替代方案,纯图片挑战还可能与 WCAG 无障碍指南发生冲突。这意味着 v2 可能会对转化率产生实际影响,尤其是在面向消费者的表单中。
在比较 reCAPTCHA v2 隐形版与 v3 时:两者对大多数用户来说都是隐藏的,但它们处理边缘情况的方式不同。隐形版 v2 在置信度较低时会回退为挑战——因此注重隐私的用户仍可能看到图片网格。v3 则永远不会显示挑战——它只会把风险评分返回给你的后端,再由后端决定如何响应。如果你的后端配置为拒绝低于某个阈值的请求,用户可能会发现自己的操作被悄悄拒绝,却没有任何解释。尽管 v3 本身并不会直接拦截任何人,但这种体验依然可能令人沮丧:真正的拦截决定始终由你的服务器逻辑作出。
无障碍说明:
功能 | reCAPTCHA v2(复选框版) | reCAPTCHA v2(隐形版) | reCAPTCHA v3 |
用户交互 | 点击复选框 + 可能出现图片网格 | 大多数用户无需交互;可疑时触发挑战 | 无——完全隐形 |
机器人检测方式 | 浏览器信号 + 挑战响应 | 浏览器信号 + 挑战回退 | 跨整个会话的行为评分 |
输出结果 | 通过 / 失败令牌 | 通过 / 失败令牌 | 每个操作对应一个评分(0.0–1.0) |
误报风险 | 低–中 | 低–中 | 中–高(针对 VPN/隐私用户) |
对残障用户的无障碍性 | 中等(图片网格可能存在问题) | 更好 | 最好(不会显示挑战) |
对用户造成的打断 | 高 | 低 | 无 |
后端复杂度 | 低(验证令牌) | 低(验证令牌) | 更高(解释评分 + 定义动作) |
隐私影响 | 中等 | 中等 | 通常更高(持续跟踪整个会话) |
最适用场景 | 高风险表单、登录、支付 | 中风险表单 | 持续监控、多操作流程 |
回答 reCAPTCHA v2 与 v3 哪个更好,完全取决于你的具体场景。没有哪个版本在所有情况下都绝对更优。
在以下情况下选择 reCAPTCHA v2:
在以下情况下选择 reCAPTCHA v3:
推荐的混合方案:
这将 v3 的流畅用户体验与 v2 的强制拦截能力结合了起来。
前往 Google 的 reCAPTCHA 管理控制台,选择 reCAPTCHA v2(“I'm not a robot” Checkbox),然后添加你的域名。你会收到一个 site key(公开)和一个 secret key(私密——仅限服务器使用,绝不要暴露在客户端)。
<!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><!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><?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 管理控制台中,选择 reCAPTCHA v3。你会收到一套与任何 v2 key 分开的密钥——不要在不同版本之间混用。
<!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>// 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 端口运行'));在构建测试自动化、QA 流水线或已授权的网页抓取工作流时,你需要一种能够以编程方式处理 reCAPTCHA 挑战的方法——而不是每次 CAPTCHA 出现时都让整套测试中断。 CapMonster Cloud 是一项自动化 CAPTCHA 求解服务,同时支持 reCAPTCHA v2 和 v3,并提供基于令牌的 API,可顺畅集成到任何技术栈中。
重要说明: CapMonster Cloud 仅适用于你已获得授权访问的网站和平台——用于测试、QA 自动化以及已授权的抓取工作流。
创建任务请求:
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..."
}
}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 类似。
# 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)// 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 保护表单交互的测试基础设施来说,它都是一种很灵活的工具。
问: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 的求解。