Cloudflare Turnstile
と CapMonster Cloud

CAPTCHA解決、ウェブサイトへのインストールとテスト。

Cloudflare Turnstileソリューションの価格

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

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

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

Cloudflare Turnstileとは
Cloudflare Turnstileとは
Cloudflare Turnstileは、Cloudflareの最新のCAPTCHAで、自動化されたアクションからウェブサイトを保護します。ウェブサイト訪問者にとって、検証はほとんど見えず、タスクを完了する必要はありません。通常、チェックボックスを1回クリックするだけで十分で、その後システムが訪問者を通過させるか、ボットの疑いでブロックするかを決定します。Cloudflare Challengeとは異なり、Turnstile CAPTCHAは別のウィンドウではなく、ウェブサイトに直接配置されます。通常、ログインまたは登録フォームに配置されます。

CapMonster Cloud経由でCloudflare Turnstileを解決する方法

Cloudflare Turnstile を含むフォームをテストする際は、キャプチャが正しく組み込まれ機能しているか確認する必要があります。

サイトに埋め込まれたキャプチャを手動で確認する方法

  • フォームのページを開き、キャプチャが表示されることを確かめます。
  • 解決せずにフォーム送信を試みると、サーバーはエラーを返すはずです。
  • 正しく解決した後は、問題なく送信できる必要があります。

自動解決には CapMonster Cloud のようなツールを使うと便利です。キャプチャのパラメータを送信すると、サーバー側で処理して利用可能なトークンを返してくれます。そのトークンをフォームに挿入すれば、ユーザー操作なしでチェックを通過できます。

CapMonster Cloud API を使った一般的な手順:

タスクの作成タスクの作成
arrow
API リクエストの送信API リクエストの送信
arrow
結果の受信結果の受信
arrow
トークンをページへ適用トークンをページへ適用
arrow
既製のライブラリを使用したCloudflare Turnstileの認識
CapMonster Cloudサービスは、PythonJavaScript(Node.js)、C#言語での便利な作業のための既製のライブラリを提供しています。
Python
JavaScript
C#
解決、トークン挿入、フォーム送信
ウェブページでのCAPTCHA認識の完全なサイクルのためのNode.jsの例。可能なアプローチ:HTTPリクエストを使用してHTMLとCAPTCHAパラメータを取得し、応答を送信して結果を処理する。または自動化ツール(例:Playwright)を使用して、ページを開き、CAPTCHAを待ち、パラメータを送信し(テストでは正しいデータと誤ったデータの両方を送信できます)、CapMonster Cloudクライアント経由で解決策を取得し、フォームにトークンを挿入して結果を確認します。
python
// npm install playwright @zennolab_com/capmonstercloud-client

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

async function main() {
  // 1. CapMonster Cloud経由でTurnstileを解決
  const cmcClient = CapMonsterCloudClientFactory.Create(
    new ClientOptions({ clientKey: 'YOUR_CAPMONSTER_API_KEY' })
  );

  const turnstileRequest = new TurnstileRequest({
    websiteURL: 'http://tsmanaged.zlsupport.com',
    websiteKey: '0x4AAAAAAABUYP0XeMJF0xoy',
  });

  const result = await cmcClient.Solve(turnstileRequest);
  const token = result.solution.token;
  console.log('Turnstileトークンを受信しました:', token);

  // 2. Playwrightの起動
  const browser = await chromium.launch({ headless: false });
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('http://tsmanaged.zlsupport.com');

  // 3. ログインとパスワードの入力
  await page.fill('#username', 'your_username');
  await page.fill('#password', 'your_password');

  // 4. 非表示のトークンフィールドが表示されるのを待つ
  await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });

  // 5. トークンを挿入してフィールドを表示する
  await page.evaluate((t) => {
    const tokenInput = document.querySelector('#token');
    if (tokenInput) {
      tokenInput.type = 'text';  // フィールドを表示する
      tokenInput.value = t;      // トークンを挿入
      console.log('トークンフィールドにトークンが挿入されました');
    } else {
      console.error('フィールド #token が見つかりません');
    }
  }, token);

  // 6. トークンが実際に挿入されたことを確認
  const checkValue = await page.$eval('#token', el => el.value);
  console.log('トークン値の確認:', checkValue);

  // 7. フォームの送信
  await page.click('button[type="submit"]');
  console.log('Turnstileトークンでフォームが送信されました');

  // await browser.close();
}

main().catch(err => console.error(err));
ウェブサイトにCloudflare Turnstileを接続する方法
ウェブサイトでのCAPTCHAの動作を自信を持ってナビゲートし、その検証ロジックを理解し、再接続または再構成するために、このセクションを学習することをお勧めします。保護の接続プロセスについて説明しており、すべての微妙な点を迅速に理解するのに役立ちます。

1. Cloudflare Turnstileページに移動し、今すぐ始めるをクリックします。

2. サービスに登録します。

3. Turnstile Widgetsで、青いAdd Widgetボタンをクリックします。

HowTo Connect image 1

4. Cloudflare Turnstileを構成し、次を指定します:

  • Widget name:CAPTCHAの名前(便宜上、例:Login form)。
  • Hostname Management:CAPTCHAが機能するドメイン(例:example.com)。
  • Widget Mode
    • Managed:最適なオプション、CAPTCHAがチェックボックスを表示するかどうかを自分で決定します。
    • Non-interactive:クリックなしで自動的に検証が実行されます。
    • Invisible:完全に非表示。
  • Pre-clearance:サイトがCloudflare Proxyを経由している場合はYesに設定します(CAPTCHAを繰り返さないため)。

5. ウィジェットを作成すると、2つのキー(Site KeySecret Key)を受け取ります。

HowTo Connect image 2

6. クライアント側を接続

1) Turnstileスクリプトを接続

自動レンダリング(ページの読み込み時にウィジェットが自動的に作成されます):

markup
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>

プログラム制御(JavaScript経由でウィジェットを自分で作成します):

markup
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>

重要:スクリプトは正確なURLから読み込む必要があります。プロキシまたはキャッシュが障害を引き起こす可能性があります。

2) ウィジェット用のコンテナを作成

自動:

markup
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>

プログラムで:

markup
<div id="turnstile-container"></div>

3) ウィジェットの構成

data属性経由:

markup
<div class="cf-turnstile"
            data-sitekey="<YOUR_SITEKEY>"
            data-theme="light"
            data-size="normal"
            data-callback="onSuccess">
          </div>

JavaScript経由:

javascript
const widgetId = turnstile.render("#turnstile-container", {
  sitekey: "<YOUR_SITEKEY>",
  theme: "light",
  size: "normal",
  callback: token => console.log("Token:", token)
});

4) トークンの操作

javascript
const token = turnstile.getResponse(widgetId);      // トークンを取得
const isExpired = turnstile.isExpired(widgetId);    // 有効期限を確認
turnstile.reset(widgetId);                          // リセット
turnstile.remove(widgetId);                         // 削除
turnstile.execute("#turnstile-container");         // 手動実行

5) フォームとの統合

markup
<form id="my-form" method="POST">
  <input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
  <button type="submit">送信</button>
</form>

<script>
function onSuccess(token) {
  document.getElementById("cf-turnstile-response").value = token;
}
</script>

コード例コード例
arrow

6) サーバー側を構成

サーバー側検証プロセス:

  • クライアント:ユーザーがページでTurnstileを完了 → トークンが作成されます。
  • フォームが送信される:トークンがフォームデータと共にサーバーに送信されます。
  • サーバー:トークンとシークレットを使用してCloudflare Siteverify APIにPOSTリクエストを行います。
  • Cloudflare:結果(success: true/false)と追加情報(action、hostname、完了時間)を含むJSONを返します。
  • サーバー:ユーザーアクションを許可するか拒否するかを決定します。

Siteverify API:

javascript
POST
https://challenges.cloudflare.com/turnstile/v0/siteverify

リクエストパラメータ:

  • secret(必須):CloudflareパネルからのTurnstile秘密鍵
  • response(必須):クライアントで受信したトークン
  • remoteip(オプション):ユーザーのIPアドレス(推奨)
  • idempotency_key(オプション):繰り返し検証に対する保護のための一意のUUID

トークンのプロパティ:

  • 最大長:2048文字
  • 5分間有効
  • 1回限りの使用
  • 期限切れまたは再検証時、APIはtimeout-or-duplicateエラーを返します

PHPでの検証例PHPでの検証例
arrow

Background
想定されるエラーとデバッグ
Bug Icon
パラメータが正しくありません
CAPTCHAが表示されないか、invalid-input-secretmissing-input-responseinvalid-input-responseなどのエラーを返します。sitekeysecret keyの有効性、およびCloudflareダッシュボードの設定を確認してください。
Bug Icon
解決タイムアウト
トークンが期限切れ(300秒間有効)または時間内に受信されませんでした。安定した接続と正しいAPI統合を確認してください。
Bug Icon
空または誤ったトークン
パラメータcf-turnstile-responseが欠落しているか、正しくありません。フォームとサーバーへのトークン転送を確認してください。
Bug Icon
レスポンス success=false
トークンが無効、期限切れ、またはすでに使用されています。各トークンは1回だけ検証できます。分析のためにSiteverifyリクエストとレスポンスのログを有効にしてください。
保護の堅牢性チェック
統合後は、システムが本当に自動化された操作からサイトを守れているか確認しましょう。
セキュリティと最適化のヒント
トークンはサーバーでのみ検証し、フロントエンドからSiteverify APIを呼び出さないでください。これにより秘密鍵が公開されます。
コードにキーを保存するのではなく、環境変数またはシークレット管理システムを使用してください。
追加フィールド(<span class="font-bold">hostname</span>、<span class="font-bold">action</span>)を確認して、リクエストがあなたのウェブサイトから来たことを確認してください。
HTTPSを使用してください。Siteverifyへのすべての呼び出しは、安全な接続を介して実行する必要があります。
エラー処理を実装してください。APIが利用できない場合、内部データを明かすことなく、ユーザーに明確なメッセージを表示してください。
ドメインごとにsitekeyの使用を制限してください。
組織またはプライバシーポリシーで必要な場合は、フォームに<span class="font-bold">プライバシーポリシー</span>と<span class="font-bold">Cloudflare利用規約</span>へのリンクを追加してください。
まとめ

すでにキャプチャや別の保護システムが導入されているサイトを引き継いだものの、コードにはアクセスできない場合でも心配はいりません!どの技術が使われているかを特定するのはそれほど難しくありません。動作が正しいか確認するには、隔離されたテスト環境で認識サービスCapMonster Cloudを利用し、トークン処理の仕組みと検証ロジックが正しく機能しているかをチェックできます。

Cloudflare Turnstileの場合も、システムを特定し、その挙動を調べて、保護機能が正しく動いていることを確認すれば十分です。この記事では、Cloudflare Turnstileを見分ける方法と、その導入や再設定に関する手順書の見つけ方を紹介しました。これにより、防御を安心して維持し、その動作をしっかりと管理できます。

Conclusion

Cloudflare Turnstile に関するよくある質問

CapMonster Cloud で Cloudflare Turnstile を解決するには:

次の JSON パラメータを含めて https://api.capmonster.cloud/createTask に POST リクエストを送信します:

json
{
  "clientKey": "API_KEY",
  "task": {
    "type": "TurnstileTask",
    "websiteURL": "[page_URL_with_Turnstile]",
    "websiteKey": "[Turnstile_website_key]"
  }
}
  • clientKey:CapMonster Cloud API キー
  • task.type:TurnstileTask
  • task.websiteURL:CAPTCHA を解決するページの URL
  • task.websiteKey:Turnstile site key。取得方法を見る。

API は taskId を返します。

応答ステータスが ready になるまで、clientKey と taskId で https://api.capmonster.cloud/getTaskResult をポーリングします。

タスクが解決されると、応答にはトークンと対応する userAgent が含まれます。

両方の値をフォームを送信する同じブラウザセッションに渡します。

詳細と例については Turnstile タスクのドキュメントを参照してください。

Cloudflare Turnstile は 3 つのウィジェットモードをサポートしています:

  • Managed:リスクに基づき、インタラクティブなチェックを表示するか、訪問者を静かに通過させるかを Turnstile が判断します。
  • Non-interactive:ユーザー操作なしで動作しますが、チェック中は表示されるウィジェットをレンダリングします。
  • Invisible:こちらもユーザー操作なしで動作しますが、ウィジェットは訪問者に表示されません。

バックエンドがクライアントから Turnstile トークンを受け取ったら:

次のパラメータで https://challenges.cloudflare.com/turnstile/v0/siteverify に POST します:

  • secret:Cloudflare ダッシュボードのウィジェットのシークレットキー
  • response:クライアント側ウィジェットからのトークン
  • remoteip(オプション):訪問者の IP アドレス
  • idempotency_key(オプション):検証を安全に再試行するために生成する UUID

エンドポイントは application/x-www-form-urlencodedapplication/json の両方を受け付けます。

トークンが検証に成功した場合、Cloudflare は success: true を返します。

フォーム送信前に page.evaluate() または他の DOM レベルの方法を使用して、[name="cf-turnstile-response"] フィールドにトークンを注入します。

一部の統合ではコールバックやカスタム JavaScript ハンドラにも依存していることに注意してください。その場合は、ウィジェットの JS コールバック関数(data-callback で定義)を呼び出し、受け取ったトークンをサーバー検証に渡します。

Turnstile siteverify からの timeout-or-duplicate エラーは、通常、トークンが検証前に期限切れになったか、複数回送信されたことを意味します。Turnstile トークンは使い捨てで、5 分後に期限切れになります。

エラーのデバッグには:

  • https://challenges.cloudflare.com/turnstile/v0/siteverify へのリクエストのログを有効にする
  • トークン作成時刻と検証時刻を比較する。
  • バックエンドが同じトークンを 2 回検証していないか確認する(再試行、リダイレクト、重複リクエスト処理時など)。