ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
reCAPTCHA とは
Google が提供する Bot 判定サービス。フォームの自動投稿(スパム / 不正登録)を防ぐためにクライアント側で g-recaptcha-response トークンを生成し、サーバ側で Google の API に問い合わせて検証します。
| バージョン | 特徴 | UI |
|---|---|---|
| v2 Checkbox | 「私はロボットではありません」 | クリック + 画像チャレンジ |
| v2 Invisible | 透明、ボタンクリックで起動 | 必要時のみチャレンジ |
| v3 | スコア (0.0〜1.0) 返却、UI なし | 無し、サイト側で閾値判定 |
| Enterprise | 有料、高度な機能 | v3 ベース |
error-codes の主要パターン
| エラーコード | 意味 | 主な原因 |
|---|---|---|
missing-input-secret | secret パラメータが無い | サーバ送信パラメータ漏れ |
invalid-input-secret | secret が無効 | キー打ち間違い、サイトキー渡しミス、v2/v3 取り違え |
missing-input-response | response パラメータが無い | クライアントからのトークン送信漏れ |
invalid-input-response | response が無効 | 期限切れ (2 分)、改竄、別サイトキーで生成 |
bad-request | リクエスト不正 | HTTP メソッド誤り、ヘッダー不足 |
timeout-or-duplicate | 期限切れ or 二重利用 | トークン使い回し、検証遅延 |
browser-error | ブラウザ側エラー | JS 無効、CSP ブロック |
サーバ側検証の最小実装 (PHP)
$token = $_POST['g-recaptcha-response'] ?? '';
$secret = env('RECAPTCHA_SECRET');
$response = file_get_contents(
'https://www.google.com/recaptcha/api/siteverify?' . http_build_query([
'secret' => $secret,
'response' => $token,
'remoteip' => $_SERVER['REMOTE_ADDR'],
])
);
$result = json_decode($response, true);
/*
[
'success' => true,
'challenge_ts' => '2026-06-10T01:23:45Z',
'hostname' => 'example.com',
'score' => 0.9, // v3 のみ
'action' => 'login', // v3 のみ
'error-codes' => [...], // エラー時のみ
]
*/
if (!($result['success'] ?? false)) {
$codes = $result['error-codes'] ?? [];
throw new Exception('reCAPTCHA 失敗: ' . implode(',', $codes));
}
// v3 はスコア閾値判定
if (($result['score'] ?? 0) < 0.5) {
throw new Exception('Bot の疑いがあります');
}
各エラーの詳細対処
missing-input-secret / invalid-input-secret
- Google Cloud Console → reCAPTCHA admin でシークレットキー (6L で始まる) を再確認
- サイトキー (HTML 側、6L から始まる) と取り違えていないか
- v2 用キーで v3 を検証していないか(バージョン違いキーは互換性無し)
.envにRECAPTCHA_SECRETが定義されているか、php artisan config:cache漏れ- テスト用キー(
6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe等)を本番に残していないか
missing-input-response
<!-- ✅ v2 Checkbox -->
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<form method="POST" action="/submit">
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
<!-- ↑ submit 時に hidden の name="g-recaptcha-response" が自動生成される -->
<button type="submit">送信</button>
</form>
<!-- ✅ v3 (透明) -->
<script src="https://www.google.com/recaptcha/api.js?render=YOUR_SITE_KEY"></script>
<script>
grecaptcha.ready(() => {
grecaptcha.execute('YOUR_SITE_KEY', { action: 'login' }).then((token) => {
document.getElementById('recaptcha-token').value = token;
});
});
</script>
<form id="login-form">
<input type="hidden" name="g-recaptcha-response" id="recaptcha-token">
</form>
invalid-input-response
- トークンの寿命は2 分。フォーム表示から送信まで時間がかかる場合は再生成が必要
- SPA / 多段ページのフローでトークンを使い回している
- サイトキーとシークレットキーが別ドメイン分になっている(ステージング用キーを本番で使用など)
- Google Cloud でドメイン登録済か(v2/v3 とも本番ドメインを admin に追加要)
timeout-or-duplicate
- 同一トークンを2 回検証している(リダイレクト後再送、リトライ機構)
- サーバ側のキューに積んで遅延処理 → 既に 2 分経過
- クライアント側 JS バグでトークンを使い回し
Laravel での実装 (anhskohbo/no-captcha)
composer require anhskohbo/no-captcha// .env
NOCAPTCHA_SECRET=6LXXXXXXX_secret_key
NOCAPTCHA_SITEKEY=6LXXXXXXX_site_key
// config/no-captcha.php
return [
'secret' => env('NOCAPTCHA_SECRET'),
'sitekey' => env('NOCAPTCHA_SITEKEY'),
'options' => [
'timeout' => 30,
],
];
// Blade
{!! NoCaptcha::renderJs('ja') !!}
<form method="POST">
@csrf
{!! NoCaptcha::display() !!}
<button>送信</button>
</form>
// バリデーション
$request->validate([
'g-recaptcha-response' => 'required|captcha',
]);
v3 のスコア活用
v3 は 0.0 (Bot 確実) 〜 1.0 (人間確実) のスコアを返します。閾値はサイト次第:
$score = $result['score'] ?? 0;
$action = $result['action'] ?? '';
if ($action !== 'login') {
abort(400, 'action mismatch');
}
if ($score >= 0.7) {
// 通常処理
} elseif ($score >= 0.3) {
// 追加チャレンジ(メール認証 / SMS)
} else {
// ブロック or 詳細ログ
Log::warning('Low reCAPTCHA score', ['score' => $score, 'ip' => request()->ip()]);
abort(403);
}
その他のトラブル
| 症状 | 原因 | 対処 |
|---|---|---|
| reCAPTCHA が表示されない | サイトキー間違い、CSP がドメインブロック | キー確認 / Content-Security-Policy に google.com 追加 |
| localhost で動かない | 許可ドメイン未登録 | admin で localhost を追加 or テストキー使用 |
| 毎回画像チャレンジが出る | IP / ブラウザがスコア低 | v3 移行 / Enterprise 検討 |
| iframe 内で動かない | X-Frame-Options ブロック | 埋め込み元の許可設定 |
FAQ
Q: v2 と v3 を同じページで併用できる?
A: 技術的には可能ですが、JS の競合が起きやすいので非推奨。サイト全体を v3 に統一が無難です。
Q: ローカル開発でテストするには?
A: Google 公式のテスト用キー(6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI など)を使うと常に成功します。本番リリース時は必ず本物のキーに差し替え。
Q: 検証 API へのリクエストがタイムアウトする
A: 本番サーバから https://www.google.com へ OUT 通信が許可されているか確認。プロキシ越しの場合は HTTPS_PROXY 設定。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?