2,481 views
この記事は最終更新から 2642日 が経過しています。
(1) やりたいこと
投稿フォームを botから守りたい。
(2) 実現方法
HTTP refererのチェックや、onetime tokenなどはよく使っているが、今回は Googleが提供している reCAPTCHAを使ってみる。
https://developers.google.com/recaptcha/

https://www.google.com/recaptcha/intro/

1. APIキーを取得
手順1: 上記二つ目のサイトにアクセスし [Get reCAPTCHA] ボタンを押す。
手順2: 認証を使用するドメインの情報を入力する。

手順3: 発行された Site-key と Secret-key を控えておく。

2. 投稿フォームを作成
投稿フォームを表示するだけのページを作る。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src='https://www.google.com/recaptcha/api.js'></script>
</head>
<body>
<form id="myForm" method="post" action="index.php">
<div class="g-recaptcha" data-callback="enbButton" data-sitekey="xxxxxxxxx"></div>
<input type="submit" name="myButton" value="送信" disabled>
</form>
<script>
function enbButton(code){
if(code !== ""){
$('#myForm input:submit').removeAttr('disabled');
}
}
</script>
</body>
</html>
3. チェック処理を作成
PHPで書く。
if(isset($_POST['myButton'])){
$gresp = $_POST['g-recaptcha-response'];
if(isset($gresp)){
$secret_key = 'yyyyyyyyyyyyyyyyyyyyyy';
$resp = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$gresp}");
$rslt = json_decode($resp, true);
if(FALSE !=== $rslt){
if(TRUE === isset($rslt['success'])){
if($rslt['success'] == TRUE){
// BOTではない!
}
}
}
}
}
出来上がったサンプルページはこちら。
https://www.dogrow.net/hp/sample/00039/
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-01-24: 1回 2026-01-23: 2回 2026-01-22: 0回 2026-01-21: 2回 2026-01-20: 0回 2026-01-19: 0回 2026-01-18: 1回