2,062 views
この記事は最終更新から 2302日 が経過しています。
(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/