reCAPTCHA v2 と v3 の比較 検証エラーの原因、対処

更新日:2025/03/11

reCAPTCHAとは

reCAPTCHA(リキャプチャ)は、Googleが提供する、ウェブサイトをスパム攻撃などのボットによる不正アクセスから守るためのサービスです。

! ⚠ 大量の不要メールによる攻撃 ⚠ システム負荷・フィッシング・マルウェア配布

お問い合わせフォームやログイン画面などでよく見かける「私はロボットではありません」のチェックボックスがreCAPTCHAです。

reCAPTCHAの仕組み

reCAPTCHAで検証は、どのような仕組み、フローで人間とボットを区別しているのでしょうか?

reCAPTCHAの検証プロセスの分岐フロー

下記の通りフローはフロントエンドとサーバーサイドの検証の2段階

人間かボットかどうかを、ユーザーのブラウザで検証
  • サイトキー(公開キー)を使用
  • V2とV3で分析方法が異なる
1. で人間であると判断された場合はトークンを発行
  • JavaScriptで取得可能
2. のトークンとシークレットキーをGoogoleのAPIにPOSTリクエスト送信
  • シークレットキーを使用
Google API から検証結果をサーバーサイドでうけとる
  • 2段階の検証プロセスで、セキュリティを強化

reCAPTCHA サーバー側検証プロセス フォーム送信 POST[‘recaptchaToken’] PHPのcURL関数 Google APIにPOSTリクエスト Google reCAPTCHA API トークン検証 JSONレスポンス {“success”: true|false, …} PHPでレスポンス処理 json_decode($response) 検証成功? はい フォーム処理継続 いいえ エラー表示 v2 と v3 の違い: • v2: if($verifyResult->success == true) { /* 成功時の処理 */ } • v3: if($verifyResult->success == true && $verifyResult->score >= 0.5) { /* 成功時の処理 */ }

reCAPTCHA 管理コンソールで事前準備

reCAPTCHAの管理コンソール(https://www.google.com/recaptcha/adminにアクセスして下記のセットアップをする必要があります

  • サイトを登録
  • reCAPTCHA v2・v3どちらを使うかタイプを選択
  • サイトキー、シークレットキーを確認

reCAPTCHA サイト登録の流れ 1 Googleアカウントが必要 2 recaptcha/admin/create にアクセス 3 ・ラベル(名前) ・reCAPTCHAタイプ(v2/v3) ・ドメイン ・オーナー(Googleメール) 送信 4 サイトキー(公開OK) シークレットキー(非公開) ※APIキーは後から recaptcha/admin で確認できます

PHP での reCAPTCHA V2 と V3 の設定方法

reCAPTCHA v2 と v3 の比較 reCAPTCHA v2 私はロボットではありません reCAPTCHA 特徴: • ユーザーの操作が必要 • チェックボックス or 画像選択 • シンプルな成功/失敗判定 • 明示的なユーザー確認 • トークンは短時間有効 reCAPTCHA v3 UI要素がない (バックグラウンド動作) Protected by reCAPTCHA 特徴: • ユーザー操作不要 • スコアベース (0.0〜1.0) • ユーザー行動を分析 • アクションごとに評価 • より自然なUX ※ フロントエンドとバックエンドで同じバージョンを使用する必要あり

ReCAPTCHA V2

フロントエンド実装(重要部分)

<!-- 1. これだけでチェックボックスが表示される -->
<div class="g-recaptcha" data-sitekey="あなたのサイトキー"></div>

<!-- 2. APIスクリプトの読み込み -->
<script src="https://www.google.com/recaptcha/api.js" async defer></script>

バックエンド検証(重要部分)

<?php
// 1. フォームからのトークン取得
$recaptchaResponse = $_POST['g-recaptcha-response'];

// 2. Google APIへのリクエスト準備
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = [
    'secret' => 'あなたのシークレットキー', // 重要:非公開にすること
    'response' => $recaptchaResponse
];

// 3. APIリクエスト実行と結果取得
$response = file_get_contents($url . '?' . http_build_query($data));
$result = json_decode($response);

// 4. 単純な成功/失敗の判定
if ($result->success) {
    // 検証成功の処理
} else {
    // 検証失敗の処理
}
?>

ReCAPTCHA V3

フロントエンド実装(重要部分)

<!-- 
  reCAPTCHA v3のスクリプトを読み込む
  サイトキーを指定して読み込む
  ?render=YOUR_SITE_KEY の形式で指定する
-->
<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>

<!-- お問い合わせフォームの例 -->
<form id="contactform" action="/submit" method="POST">
  <!-- フォームの内容(名前、メール、メッセージなど) -->
  <input type="text" name="name" placeholder="お名前">
  <input type="email" name="email" placeholder="メールアドレス">
  <textarea name="message" placeholder="メッセージ"></textarea>
  
  <!-- 
    reCAPTCHAトークンを格納するための隠しフィールド
    これがサーバーに送信され、検証に使用される
  -->
  <input type="hidden" name="recaptchaToken" id="recaptchaToken">
  
  <button type="submit">送信する</button>
</form>

<!-- reCAPTCHA処理のためのJavaScript -->
<script>
  // フォーム要素を取得
  const form = document.getElementById('contactform');
  
  // フォーム送信イベントに処理をアタッチ
  form.addEventListener('submit', function(event) {
    // デフォルトの送信をキャンセル
    event.preventDefault();
    
    // reCAPTCHA処理の開始
    // grecaptcha.readyはreCAPTCHAが読み込まれたことを確認
    grecaptcha.ready(function() {
      // サイトキーを使ってreCAPTCHAを実行
      // 第一引数: サイトキー
      // 第二引数: アクション名(ログやダッシュボードで使用)
      grecaptcha.execute('YOUR_SITE_KEY', {
        action: 'submit' // アクション名は自由に設定可能
      }).then(function(token) {
        // 取得したトークンを隠しフィールドに設定
        document.getElementById('recaptchaToken').value = token;
        
        // フォームを実際に送信
        form.submit();
      });
    });
  });
</script>

バックエンド検証(重要部分)

<?php
// POSTリクエストかどうかを確認
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    
    // reCAPTCHAのシークレットキー(管理画面で取得した秘密鍵)
    $secretKey = 'あなたのシークレットキーをここに設定';
    
    // Google reCAPTCHA検証APIのURL
    $url = 'https://www.google.com/recaptcha/api/siteverify';
    
    // 検証に必要なデータの準備
    $data = [
        'secret' => $secretKey,  // シークレットキー
        'response' => isset($_POST['recaptchaToken']) ? $_POST['recaptchaToken'] : ''  // フォームから取得したトークン
    ];
    
    // cURLセッションの初期化
    $ch = curl_init();
    
    // cURLオプションの設定
    curl_setopt($ch, CURLOPT_URL, $url);  // 接続先URL
    curl_setopt($ch, CURLOPT_POST, true);  // POSTメソッドを使用
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));  // POSTデータ
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // 結果を文字列で返す
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);  // SSL証明書の検証を有効化
    
    // cURLリクエストの実行と結果の取得
    $response = curl_exec($ch);
    
    // cURLセッションの終了
    curl_close($ch);
    
    // JSON形式のレスポンスをPHPオブジェクトに変換
    $verifyResult = json_decode($response);
    
    // ここで $verifyResult->success が true なら人間、false ならボットと判定できる
    if ($verifyResult->success) {
        // 検証成功時の処理
        // 例: フォームの本来の処理を続行
    } else {
        // 検証失敗時の処理
        // 例: エラーメッセージを表示
    }
}
?>
ReCAPTCHA V2 vs V3 の重要ポイント reCAPTCHA V2 reCAPTCHA V3 フロントエンド実装 <div class=”g-recaptcha” data-sitekey=”サイトキー”> </div> <script src=”https://www.google.com/ recaptcha/api.js”></script> フロントエンド実装 <input type=”hidden” id=”g-recaptcha- response” name=”g-recaptcha-response”> grecaptcha.ready(function() { grecaptcha.execute(‘サイトキー’, {action: ‘submit’}).then(function(token) { document.getElementById(‘g-recaptcha- response’).value = token; }); バックエンド検証 (PHP) $url = ‘https://www.google.com/ recaptcha/api/siteverify’; $data = [ ‘secret’ => ‘シークレットキー’, ‘response’ => $_POST[‘g-recaptcha- response’] バックエンド検証 (PHP) $result = json_decode($response); if ($result->success) { // アクション名の確認 if ($result->action === ‘submit’) { // スコアチェック if ($result->score >= 0.5) { // 検証成功 ● ユーザー操作が必要(チェックボックス) ● 成功/失敗の二値判定 ● 実装が比較的シンプル ● ユーザー操作が不要(バックグラウンド実行) ● スコアベース判定(0.0〜1.0) ● JavaScript 操作が若干複雑 ⚠️ 注意ポイント シークレットキーは絶対に公開しない HTTPSでの使用を推奨

実装時の最重要ポイント

  1. シークレットキーの保護: バックエンドのコードにのみ記述し、フロントエンドのJavaScriptに記述しない
  2. V3のアクション名: フロントエンドとバックエンドで一致させる
  3. V3のスコアしきい値: サイトの性質に応じて0.1〜0.9の間で調整(0.5が一般的)
  4. エラー処理: API通信エラーも適切に処理する
  5. HTTPS環境: reCAPTCHAはHTTPS環境での使用が推奨される

これらのポイントを押さえることで、効果的にreCAPTCHAを実装できます。

reCAPTCHAのバージョンの違い

バージョン特徴メリットデメリット適した用途
reCAPTCHA v3– 完全バックグラウンドで動作
– スコア判定でbotと人間を区別
– ユーザー操作不要
– 離脱率が低い
– 精度に限界がある
– 設定にはデータ分析が必要
ユーザビリティ重視
お問い合わせフォーム
ECサイト
reCAPTCHA v2– 「私はロボットではありません」のチェックボックス
– 必要に応じて画像認証を追加
– 高いセキュリティ
– 導入が簡単
– ユーザー操作が必要
– 離脱率が上がる可能性
会員登録フォーム
高セキュリティ
reCAPTCHA v2 Invisible– 非表示型の認証
– ボタン操作時に自動判定
– 必要に応じて画像認証を追加
– 通常はユーザー操作不要
– セキュリティとユーザビリティのバランスが良い
– 疑わしい場合に画像認証が発生バランス重視のフォーム

reCAPTCHA設定方法

人気記事ランキング
話題のキーワードから探す