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

更新日:2025/03/11

reCAPTCHAとは

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

お問い合わせフォームやログイン画面などでよく見かける「私はロボットではありません」のチェックボックスがreCAPTCHAです。ウェブサイトの安全性を保つために非常に重要な役割を果たしています。

ReCAPTCHA の仕組み ユーザー ウェブサイト Google サーバー 1. アクセス 2. reCAPTCHA表示 3. チャレンジ回答 4. 検証リクエスト 5. 検証結果 ユーザー行動分析 – マウス動作 – ブラウザ情報 – クリックパターン reCAPTCHAの主な種類 チェックボックス型 画像認識型 インビジブル型 (バックグラウンド検証)
reCAPTCHA トークンの生成と検証フロー ブラウザ Google サーバー Webサーバー 1. サイトキーでreCAPTCHA読み込み 2. reCAPTCHAスクリプト提供 3. トークン生成リクエスト 4. reCAPTCHAトークン生成 5. トークン付きフォーム送信 v2: ユーザー操作でトークン生成 v3: ページ読み込み時に自動生成 ※トークンは暗号化された一意の文字列(有効期限約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 キーの関係とアーキテクチャ Google reCAPTCHA Admin キーペアの生成と管理 サイトキー 公開情報 HTML/JavaScriptで使用 シークレットキー 非公開情報 サーバーサイドのみで使用 フロントエンド (index.php) • reCAPTCHA APIの読み込み • トークンの生成 • フォーム送信時にトークン添付 バックエンド (mail_web.php) • POSTデータからトークン取得 • Google APIに検証リクエスト • 結果に基づき処理実行 重要: サイトキーとシークレットキーは同じバージョンのペアを使用すること v2とv3のキーを混在させると、トークン検証に失敗する可能性あり!?

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

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

<!-- 1. 隠しフィールドの準備(ユーザーには見えない) -->
<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">

<!-- 2. APIスクリプトの読み込み(サイトキー付き) -->
<script src="https://www.google.com/recaptcha/api.js?render=あなたのサイトキー"></script>

<!-- 3. JavaScriptでトークン取得 -->
<script>
grecaptcha.ready(function() {
    // アクション名の指定(バックエンドでも確認する)
    grecaptcha.execute('あなたのサイトキー', {action: 'フォーム送信'})
    .then(function(token) {
        // トークンを隠しフィールドにセット
        document.getElementById('g-recaptcha-response').value = token;
    });
});
</script>

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

<?php
// 1. V2と同様にAPIリクエスト(省略)

// 2. V3特有の検証
if ($result->success) {
    // アクション名の確認(重要)
    if ($result->action === 'フォーム送信') {
        // スコアチェック(0.0〜1.0、高いほど人間らしい)
        if ($result->score >= 0.5) {
            // 十分なスコアで検証成功
        } else {
            // スコア不足(ボットの可能性)
        }
    } 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設定方法

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