logo
bars

Cloudflare Challenge
と CapMonster Cloud

キャプチャの解決、サイトへの設置、テスト。
キャプチャや防御機構が導入済みのサイトを引き継いだのに、ソースコードへアクセスできない? その場合、どの仕組みが入っているのか、設定は正しいのか、どう検証するのかが気になります。

この記事では、よくある疑問にできるだけお答えしました。まず最初のステップは、どのような保護システムが使われているかを特定することです。そのために、代表的なキャプチャやボット対策システムの一覧を参照できます。ここには、どの仕組みが使われているかを素早く見分けるための画面イメージや主な特徴がまとめられています。

もしサイトで Cloudflare Challenge が使われていることが分かったら、次のステップはその特徴と動作をより詳しく確認することです。同じこの記事の中で、Cloudflare Challenge をサイトに導入するための手順書も確認できるので、あなたのサイト上でどのように機能しているのかをしっかり理解できます。これにより、現在の保護を正しく把握できるだけでなく、今後の運用や保守も計画的に行えるようになります。

Cloudflare Challengeとは
Cloudflare Challengeとは
Cloudflare Challenge(またはインタースティシャルチャレンジページ)は、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を手動でテストできます:
  • チャレンジが表示されるはずのページをシークレットモードで開き、キャプチャが表示されることを確認します。
  • ブラウザに誤ったcf_clearanceクッキーを設定してみてください(詳細は下記) — サーバーはエラーを返すはずです。
  • キャプチャを正常に解決すると、検証なしで実際のサイトページが開きます。
自動テストおよびキャプチャ認識には、CapMonster Cloudのような専門サービスを使用できます。これは、キャプチャのパラメータを受け取り、サーバー上で処理し、完成した解決策を返します。この解決策(トークンまたはクッキー)をフォームやブラウザに適用することで、ユーザーの操作なしに検証を通過できます。

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の解決とクッキーの設定
Node.jsの例は、ウェブページ上でのキャプチャ認識のフルサイクル用です。アプローチ例:HTTPリクエストでHTMLと保護パラメータを取得し、応答を送信して結果を処理する。あるいはPlaywrightなどの自動化ツールを使い、ページを開き、検証完了を待ち、CapMonster Cloud経由でパラメータを送信し、結果を取得、ブラウザにクッキーを設定(テストでは正しい値または誤った値を使用可能)、結果を確認します。

  // 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
  });

  // 必要な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を取得し、CapMonster用にBase64に変換
  const htmlBase64 = Buffer.from(await page.content(), 'utf-8').toString('base64');

  // cf_clearance取得のためTurnstileタスクを作成
  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クッキーをブラウザコンテキストに追加
  await context.addCookies([{
    name: 'cf_clearance',
    value: cf_clearance,
    domain: '.' + new URL(TARGET_URL).hostname,
    path: '/',
    httpOnly: true,
    secure: true
  }]);
  console.log('cf_clearanceクッキーをブラウザに正常に追加しました。');

  // 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クッキーが付与され、同じブラウザ・デバイスから再度アクセスしても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