logo
bars

Cloudflare Challenge
与 CapMonster Cloud

验证码解决方案、网站安装与测试。
接手一个已经部署 captcha 或其他防护的站点,却无法访问源代码?此时最关心的是使用了哪种方案、配置是否正确以及如何测试。

在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。

如果您发现自己的网站使用的是 Cloudflare Challenge,下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 Cloudflare Challenge 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。

什么是 Cloudflare Challenge
什么是 Cloudflare Challenge
Cloudflare Challenge(或中间验证页面 Interstitial Challenge Pages)是 Cloudflare 提供的验证系统,用于保护网站免受机器人、垃圾流量和恶意流量的攻击。 当 Cloudflare 怀疑请求不是来自真实用户(例如,IP 可疑或缺少 JavaScript),它会显示 Challenge——即用户需要完成的“挑战”,以确认自己是人类。此类验证与 Turnstile 不同,用户首先会看到一个中间页面,显示“Just a moment…”和“Verifying you are human. This may take a few seconds.”

如何通过 CapMonster Cloud 解决 Cloudflare Challenge

在使用 Cloudflare Challenge 测试防护时,重要的是确保验证正常运行并能正确拦截可疑流量。
您可以手动测试在页面上安装的 challenge
  • 以隐身模式打开预期有 Challenge 的页面,确保验证码显示正常。
  • 尝试在浏览器中使用错误的 cf_clearance cookie(详见下文)——服务器应返回错误。
  • 成功解决验证码后,网站页面应正常打开,无需验证。
对于自动化测试和验证码识别,可以使用专门服务,例如 CapMonster Cloud——该工具接收验证码参数,在服务器端处理,并返回可用解决方案。该解决方案(token 或 cookie)可以插入表单或浏览器,以便无需用户干预即可通过验证。

通过 CapMonster Cloud API 工作的一般流程:

创建任务创建任务
arrow
发送 API 请求发送 API 请求
arrow
获取结果获取结果
arrow
设置 cf_clearance设置 cf_clearance
arrow
使用现成库识别 Cloudflare Challenge
CapMonster Cloud 提供可在 PythonJavaScript (Node.js)C# 中使用的现成库。
Python
JavaScript
C#
解决 Challenge 并设置 Cookie
Node.js 示例,展示完整的网页验证码识别流程。方法包括:使用 HTTP 请求获取 HTML 和保护系统参数,提交答案并处理结果。或者使用自动化工具(如 Playwright)——打开页面、等待验证、通过 CapMonster Cloud 提交参数、获取结果、在浏览器中设置 cookie(可用正确或错误数据测试),然后查看结果。

  // npm install playwright @zennolab_com/capmonstercloud-client
// npx playwright install chromium

import { chromium } from 'playwright';
import {
  CapMonsterCloudClientFactory,
  ClientOptions,
  TurnstileRequest
} from '@zennolab_com/capmonstercloud-client';

// 设置 — 替换为您的值
const API_KEY = 'YOUR_API_KEY';
const TARGET_URL = 'https://www.example.com';
const SITE_KEY = 'xxxxx'; // 可传任意字符串
const USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36';

// 代理设置
const proxy = {
  proxyType: 'http',
  proxyAddress: '8.8.8.8',
  proxyPort: 8080,
  proxyLogin: 'proxyLogin',
  proxyPassword: 'proxyPassword'
};

async function main() {

  const cmcClient = CapMonsterCloudClientFactory.Create(
    new ClientOptions({ clientKey: API_KEY })
  );

  // 启动浏览器
  const browser = await chromium.launch({
    headless: false,
    proxy: proxy.proxyAddress ? {
      server: `${proxy.proxyType}://${proxy.proxyAddress}:${proxy.proxyPort}`,
      username: proxy.proxyLogin,
      password: proxy.proxyPassword
    } : undefined
  });

  // 创建 context 并设置 User-Agent 与窗口大小(可选)
  const context = await browser.newContext({ userAgent: USER_AGENT, viewport: { width: 1280, height: 800 } });

  // 创建页面并加载目标 URL
  const page = await context.newPage();
  const resp = await page.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
  console.log('初始请求状态:', resp?.status());

  // 获取页面 HTML 并转换为 Base64 供 CapMonster 使用
  const htmlBase64 = Buffer.from(await page.content(), 'utf-8').toString('base64');

  // 创建 Turnstile 任务以获取 cf_clearance
  const solveResult = await cmcClient.Solve(new TurnstileRequest({
    websiteURL: TARGET_URL,
    websiteKey: SITE_KEY,
    cloudflareTaskType: 'cf_clearance',
    htmlPageBase64: htmlBase64,
    userAgent: USER_AGENT,
    proxy: proxy.proxyAddress ? proxy : undefined
  }));

  const cf_clearance = solveResult?.solution?.cf_clearance;
  if (!cf_clearance) {
    console.error('无法从 CapMonster 获取 cf_clearance:', solveResult);
    await browser.close();
    return;
  }
  console.log('cf_clearance 已获取:', cf_clearance);

  // 将 cf_clearance cookie 添加到浏览器 context
  await context.addCookies([{
    name: 'cf_clearance',
    value: cf_clearance,
    domain: '.' + new URL(TARGET_URL).hostname,
    path: '/',
    httpOnly: true,
    secure: true
  }]);
  console.log('cf_clearance cookie 已成功添加到浏览器。');

  // 使用 cf_clearance 重新打开页面
  const page2 = await context.newPage();
  const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
  console.log('设置 cf_clearance 后的请求状态:', resp2?.status());

  await browser.close();
  console.log('脚本已完成。');
}

main().catch(err => {
  console.error('发生错误:', err);
  process.exit(1);
});
  
如何将 Cloudflare Challenge 连接到您的网站
为了理解验证码在网站上的工作方式、验证逻辑以及如何重新连接或重新配置,我们推荐阅读此部分。它说明了保护配置流程,帮助快速掌握所有细节。
1. 注册或登录账户,并将域名连接到 Cloudflare。
2. 通过 WAF 规则启用 Challenge。
路径:Security → Custom Rules → Create rule
HowTo Connect image 1

条件示例(检查整个登录页面):
http.request.uri.path contains "/login"
3. 选择操作:
Managed Challenge(推荐)——系统会自动决定是否显示 Challenge 以及显示哪种。
设置其余所需选项,然后点击 Deploy
验证通过后,用户将获得 cf_clearance cookie——可避免在同一设备和浏览器上再次显示 Challenge。
Background
可能的错误与调试
Bug Icon
域名或规则配置错误
Challenge 未显示。请检查 WAF 规则是否绑定到正确的 URI、路径或主机。
Bug Icon
页面或 challenge 加载超时
浏览器或客户端未等待 Cloudflare 响应。请在测试和监控中增加超时时间。
Bug Icon
重复验证或 cf_clearance 已过期
如果用户使用已过期的 cf_clearance,系统将再次显示 Challenge。
Bug Icon
Challenge 后有其他验证
同时使用 Challenge 和自定义规则可能导致循环验证。请遵循 Cloudflare 的建议 解决。
验证防护的可靠性
安全与优化建议
根据风险等级配置 WAF 和 Managed/JS/Interactive Challenge。
记录安全事件及 Challenge 状态,以了解阻止原因及误报情况。
为透明度和合规性,在有 Challenge 的页面添加 Cloudflare/网站的 <b>隐私政策</b> 和 <b>使用条款</b> 链接。
结论

如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。

对于Cloudflare Challenge,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 Cloudflare Challenge,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。

Conclusion