<!-- Capcat 文档「防护能力」的 Markdown 版本（对应页面 https://capcat.ai/cn/guide/protection.html）。全部文档索引：https://capcat.ai/llms.txt -->

# 防护能力

基础 Capcat 不用图形拼图或第三方追踪 cookie。它叠加多个相互独立的防护层，让自动化滥用的成本层层抬高。PoW、环境校验与现成自动化浏览器拦截默认开启；行为评分、自适应处置和第三方 provider 还分别受站点 opt-in 与 operator runtime gate 控制。代码已发布或控制台出现选项，都不等于该层已经对生产流量生效。

## 工作量证明——基座

每次验证都要求浏览器完成一道 SHA-256 工作量证明，由开源 [Cap](https://github.com/tiagozip/cap) 引擎驱动。它在后台静默运行：真实用户最多感知到亚秒级的延迟，而批量滥用者的每一次尝试都要付出真金白银的 CPU 时间。

## 环境校验

每道挑战都附带一段动态生成的校验程序，必须在求解环境里完整跑完。它确认求解发生在真实浏览器中——直连 API 的脚本（curl、Python、Node 机器人）即使算出了工作量证明也换不到 token。程序逐挑战重新生成并随机化，不存在可以写死绕过的固定检查清单。全部站点默认开启。

## 无头浏览器拦截

Selenium、Playwright、Puppeteer 等现成自动化工具以及无头浏览器，会在客户端与服务端被双重识别并拒绝。Capcat 在上游引擎之上持续维护和强化这套检测，置信度最高的信号每道挑战必查。默认开启；若你的用户群里有安装自动化类浏览器扩展的真实用户，可按站点关闭。

这层针对现成工具特征，不承诺拦住经过修改的 stealth browser、真实浏览器代解或人工打码。能通过静态环境检查的 residual automation，需要下面的行为、velocity、provider score 与业务后端策略继续判断。

## 有界行为与 Account Defense——分阶段启用

当站点和 operator runtime gate 同时开启时，Widget 会按签名策略采集最多 15 秒、128 个样本的鼠标/触摸/键盘、激活、焦点与可见性聚合；只上传直方图和统计量，不上传原始坐标或事件序列。建议重新复制控制台生成的 embed，使其包含 `data-cap-behavior-signals`，这样可以在页面加载后提前取得签名策略并覆盖点击前的接近轨迹；旧 embed 只能在首次交互后的预取窗口发现策略，快速首次点击可能只有 activation coverage。

服务端可把这些聚合与网络 provenance、hosting ASN、短窗 velocity 组合成 `risk_score`，再随一次性 token 送到鉴权后的 `/siteverify`，由你的注册后端决定放行、二次验证或拒绝。只有控制台 runtime 状态明确显示 **Collection**、**Token metadata** 与 **Score response** 已开启时，这些字段才存在；缺失字段绝不能当作低风险。当前 development ML candidate 只允许隔离 shadow，不参与生产拦截。

## 自适应难度

自适应管线可以按站点流量形态临时调高工作量证明难度，恢复正常后再降回。但它不是默认全站开启：只有 ingestion、告警、warm-up、canary 与 rollback gate 全部通过后，operator 才能逐步启用。控制台或文档出现该能力时，不应据此假设当前站点已经自动加固。

## 时间锁谜题（RSW）——按需开启

对注册、下单、领券等高价值接口，可以启用 RSW 时间锁谜题：一种本质上串行的计算，堆核心、上 GPU 都无法加速。每次验证都要等待与硬件无关的固定时长，把任何规模的机器人集群限制在恒定的单客户端速率上。强度按站点可调，默认约增加 0.5–2 秒。

## Cloudflare Turnstile（Invisible）——可选

你可以叠加一套使用自有密钥的 Turnstile，作为纵深防御。这是付费套餐的高级能力（管理员与 internal 账号同等可用）；Free 账号的控制台不显示该配置，套餐降级后运行时会自动关闭，但保留已存凭据便于之后恢复。该功能默认关闭。请在 Cloudflare 创建 Widget 时选择 **Widget mode: Invisible**——`invisible` 是 Widget 模式，不是客户端 `size` 参数。开启后，用户激活 Capcat 勾选框时，Turnstile 与 Capcat challenge 会并行执行，Widget 在同一次 redeem 请求中提交两份结果。

只有站点保存了 BYOK site key/secret、base snapshot 已收敛且 mode 的 runtime 状态为 `observe` 或 `strict` 时才会执行；defaults-off dark deploy 不会改变任何请求。

- **Observe** 会执行并记录 Turnstile，但它明确拒绝或服务不可用时，都不会拦截原本有效的 Capcat 解答。建议先用这个模式测兼容性与误伤。
- **Strict** 要求两项同时通过。缺失或被拒绝的 token 返回 `403`；服务端访问 Siteverify 遇到网络、限流或内部故障时返回可重试的 `503`。

Capcat 会先验证自身签名挑战并消费 nonce，之后才调用 Cloudflare，因此任意伪造请求不能直接消耗第三方核验。服务端还会核对 Turnstile 返回的 `hostname`、签名绑定的 action 和逐 challenge 绑定的 `cData`；第三方 secret 只以站点绑定的 AES-GCM 密文保存，绝不会返回浏览器。

此模式会从 `https://challenges.cloudflare.com` 加载第三方代码，并向 Cloudflare 发送验证所需的网络与浏览器信号。Cloudflare 要求 Invisible mode 的使用者在隐私政策中引用 [Turnstile Privacy Addendum](https://www.cloudflare.com/turnstile-privacy-policy/)。若使用 CSP，至少在 `script-src` 与 `frame-src` 中放行该 origin。Strict 模式要求正常浏览器 `Origin`，不适合依赖「允许无 Origin」例外的原生客户端。

## Google reCAPTCHA v3——可选

你也可以 BYOK 一组经典 reCAPTCHA v3 site key 与 secret。它与 Turnstile 共用相同的付费权益门禁，两者相互独立，也可以同时开启。只有用户激活 Capcat 勾选框时才执行 v3；签发 Capcat token 前，服务端会核验 Google 返回的 `success`、`hostname`、`action` 与数值 `score`。

这同样是 defaults-off 能力。只有凭据、隐私披露、base snapshot 与站点 enabled 状态全部就绪后才会加载 Google；仅部署代码或设置加密 master key 不会产生评分或拦截。

控制台可设置 `0` 到 `1` 的最低通过分数：

- 设为 `0.3` 时，低于 `0.3` 的结果会被拒绝，Capcat 勾选框保持无效；
- 设为 `0` 时，任何**有效**的 Google 分数都可通过，但不会跳过 Google token 核验。鉴权后的 Capcat `/siteverify` 会返回该分数，供你的后端自行执行更细的策略。

例如，启用 v3 的站点校验成功后可返回 `{ "success": true, "score": 0.7 }`。分数与不透明、一次性的 Capcat token 绑定，不会暴露在浏览器的 solve 事件中；因此后端无需信任客户端自报的分数，同时保留 reCAPTCHA 风格的服务端响应。

Google 规定 v3 token 两分钟过期、只能核验一次，并应在受保护动作发生时执行而不是页面加载时执行。Capcat 遵循这一生命周期并核对预期 action。详见 Google 的 [reCAPTCHA v3 指南](https://developers.google.com/recaptcha/docs/v3) 与[服务端核验契约](https://developers.google.com/recaptcha/docs/verify)。

选择阻断阈值前，应先在真实流量中观察分数。Google 说明 v3 评分依赖真实流量，并建议测试环境使用独立 key；自动化测试分数不能替代生产校准，详见 [reCAPTCHA FAQ](https://developers.google.com/recaptcha/docs/faq)。

经典 v3 超出月配额后，可能在附带 `Over free quota.` 错误的同时返回固定 `0.9`。Capcat 不会把这个兜底分数当成真实评分；任何 provider error 都按服务不可用（`503`）拒绝。使用 BYOK 时请监控 Google 配额。

启用后页面会加载 `www.google.com` 与 `www.gstatic.com` 的第三方代码，reCAPTCHA 还会为风险分析设置必要 cookie。请补充相应隐私披露，并在 CSP 中按 Google 文档放行 `script-src`、`frame-src` 与 `connect-src`。Capcat 默认保留 reCAPTCHA badge；除非同时加入 Google 要求的 Privacy Policy 与 Terms of Service 文案，否则不要隐藏。BYOK secret 只以站点绑定的 AES-GCM 密文保存，绝不会下发浏览器。本接入只支持经典 v3 key；reCAPTCHA Enterprise 使用不同的 assessment API，不能混用。由于 Capcat 会把 provider hostname 与浏览器 `Origin` 精确核对，这层防线不适用于原生客户端或其它无 Origin 客户端。

## 服务层防线

- **域名绑定**——site key 只在你允许的域名下生效，其余请求在消耗额度之前就被拒绝；
- **token 一次性核销**——验证 token 只能核销一次，重放必失败；
- **限流与配额**——按 key 限流加每月配额，失控或恶意的用量不会变成你的账单。

## 坦白局限

没有任何验证码——包括商业产品——能拦住手握定制隐身浏览器和真实硬件的顽固攻击者。叠加独立防护层的意义在于经济账：每次尝试的 CPU 成本、恒定速率的时间锁、专破现成工具的环境校验、滥用一露头就上调的难度。可选的独立供应商能增加一类信号，也会带来它自己的可用性和隐私取舍。我们把这一点如实写出来，而不是承诺魔法。

以上能力会在[控制台](https://console.capcat.ai/cn)站点详情的**防护**卡片中分别显示“配置意图”和 runtime 状态。若控制面处于 rollout freeze，写入会被明确拒绝，不能把只读选项当成已开启；解除冻结后也必须等待 base snapshot 发布与多 POP 验证，不能承诺固定一分钟生效。
