reCAPTCHA v2 と v3 の比較 検証エラーの原因、対処
更新日:2025/03/11

reCAPTCHAとは
reCAPTCHA(リキャプチャ)は、Googleが提供する、ウェブサイトをスパム攻撃などのボットによる不正アクセスから守るためのサービスです。
お問い合わせフォームやログイン画面などでよく見かける「私はロボットではありません」のチェックボックスがreCAPTCHAです。
reCAPTCHAの仕組み
reCAPTCHAで検証は、どのような仕組み、フローで人間とボットを区別しているのでしょうか?

reCAPTCHAの検証プロセスの分岐フロー
下記の通りフローはフロントエンドとサーバーサイドの検証の2段階
- サイトキー(公開キー)を使用
- V2とV3で分析方法が異なる
- JavaScriptで取得可能
- シークレットキーを使用
- 2段階の検証プロセスで、セキュリティを強化
reCAPTCHA 管理コンソールで事前準備
reCAPTCHAの管理コンソール(https://www.google.com/recaptcha/admin)にアクセスして下記のセットアップをする必要があります
- サイトを登録
- reCAPTCHA v2・v3どちらを使うかタイプを選択
- サイトキー、シークレットキーを確認
PHP での reCAPTCHA V2 と V3 の設定方法
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 {
// 検証失敗時の処理
// 例: エラーメッセージを表示
}
}
?>
実装時の最重要ポイント
- シークレットキーの保護: バックエンドのコードにのみ記述し、フロントエンドのJavaScriptに記述しない
- V3のアクション名: フロントエンドとバックエンドで一致させる
- V3のスコアしきい値: サイトの性質に応じて0.1〜0.9の間で調整(0.5が一般的)
- エラー処理: API通信エラーも適切に処理する
- HTTPS環境: reCAPTCHAはHTTPS環境での使用が推奨される
これらのポイントを押さえることで、効果的にreCAPTCHAを実装できます。
reCAPTCHAのバージョンの違い
バージョン | 特徴 | メリット | デメリット | 適した用途 |
---|---|---|---|---|
reCAPTCHA v3 | – 完全バックグラウンドで動作 – スコア判定でbotと人間を区別 | – ユーザー操作不要 – 離脱率が低い | – 精度に限界がある – 設定にはデータ分析が必要 | ユーザビリティ重視 お問い合わせフォーム ECサイト |
reCAPTCHA v2 | – 「私はロボットではありません」のチェックボックス – 必要に応じて画像認証を追加 | – 高いセキュリティ – 導入が簡単 | – ユーザー操作が必要 – 離脱率が上がる可能性 | 会員登録フォーム 高セキュリティ |
reCAPTCHA v2 Invisible | – 非表示型の認証 – ボタン操作時に自動判定 – 必要に応じて画像認証を追加 | – 通常はユーザー操作不要 – セキュリティとユーザビリティのバランスが良い | – 疑わしい場合に画像認証が発生 | バランス重視のフォーム |
reCAPTCHA設定方法

-
検索
(例) debug search etc.. -
カテゴリー
-
mixhostでのWordPress利用について
更新日:2024/04/02
299 view
-
scrollHint
更新日:2024/03/13
250 view
-
XML Sitemap Generator for Google不具合のダウングレード対応、代替プラグイン
更新日:2024/06/13
236 view
-
【SnowMonkey】納品までのフローまとめ
更新日:2025/02/15
163 view
-
ワードプレスでフォントを変えたいとき、プラグインを使えば初心者でも簡単
更新日:2025/02/16
144 view
-
【Googleサーチコンソール】検索画面で表示させたくない「Googleのインデックス削除」
更新日:2024/06/07
129 view
-
【ショートコード】編集画面で任意の場所にHTMLファイルを挿入
更新日:2024/01/26
122 view
-
キーワード検索で上位表示させる方法【SEO】
更新日:2023/10/28
120 view
-
tailwindcss使い方
更新日:2024/03/13
120 view
-
Recline: GitHub Copilotで動作するClaude 3.5 Sonnet搭載の開発支援ツール
更新日:2025/01/20
110 view
-
WordPressプラグイン「All-in-One WP Migration」のトラブル
更新日:2022/03/31
84 view
-
ワードプレスセキュリティー対策まとめ【2025年】「site guard wordpress」「BackWPup バージョン5でUI変更!?」
更新日:2025/02/25
76 view
-
SSHを使用してGitHubのリポジトリをクローン、複数の接続元で公開鍵をディレクトリで区別する方法
更新日:2025/01/13
47 view
-
VSCodeで開発効率を劇的に向上させる!Roo-Clineプラグイン完全ガイド【Gemini API】
更新日:2025/02/08
41 view
-
「JSONスキーマ」と「Few-shot Learning」で実現する次世代生成AIソフトウェア開発の可能性
更新日:2025/02/12
40 view
-
WordPressの無料画像素材のおすすめダウンロードサイト!
更新日:2022/02/22
35 view
-
リファクタリング【VSCode Javasctipt Python】
更新日:2025/03/09
35 view
-
形態素解析とは?初心者でもわかるツールの使い方と実践例
更新日:2025/02/08
33 view
-
【Next.js AWS】音声文字起こし&要約、分析アプリケーション(S3)(Transcribe)(Amazon Bedrock)
更新日:2025/02/13
30 view
-
Express、FastAPIを使用し、二重fetch構成のメリット
更新日:2025/03/26
29 view