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

reCAPTCHAの検証プロセスの分岐フロー
下記の通りフローはフロントエンドとサーバーサイドの検証の2段階
人間かボットかどうかを、ユーザーのブラウザで検証
- サイトキー(公開キー)を使用
- V2とV3で分析方法が異なる
1. で人間であると判断された場合はトークンを発行
- JavaScriptで取得可能
2. のトークンとシークレットキーをGoogoleのAPIにPOSTリクエスト送信
- シークレットキーを使用
Google API から検証結果をサーバーサイドでうけとる
- 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 | – 非表示型の認証 – ボタン操作時に自動判定 – 必要に応じて画像認証を追加 | – 通常はユーザー操作不要 – セキュリティとユーザビリティのバランスが良い | – 疑わしい場合に画像認証が発生 | バランス重視のフォーム |