自分のための忘備録です。
reCAPTCHAとは
google reCAPTCHAとはフォーム送信の際に画像認証などを用い、botを防ぐ仕組み。
V2とV3がある。
v2とv3の違い
V2・・・画像認証が出てチェックさせる。フォーム送信に手間がかかる。
V3・・・フォームでの挙動から自動でbotか判断する。フォーム送信に手間がかからないが、効いてるのかいまいち分からない。
設置方法
①まずgoogleアカウントを作り、ダッシュボードでプロジェクトを作っておく
上の「Google Cloud Platform」の横にあるところから「新しいプロジェクト」
②reCAPTCHAを設置したいドメインを登録して、v2かv3を選んでキーをもらう
サイトキーとシークレットキーがある。
##v2の設置コード
htmlだけで済ませたいならこちら
htmlとphpで処理を分けるならこちら
##v3の設置コード
##v3設置してて問題点が出てきた
どうやらreCAPTCHAはトークンを取得して5分経つとタイムアウトエラー出るみたいです。
##タイムアウトエラー対策
タイムアウトエラーだけ無視できるようにちょっと変更します。
ついでに条件を「スコアが0.9以上なら成功」に変更
if (!empty($_POST['recaptchaResponse'])) {
$secret = 'シークレットキーを入れる';
$verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['recaptchaResponse']);
$reCAPTCHA = json_decode($verifyResponse);
$reCAPTCHA_error = [];
if($reCAPTCHA->{'error-codes'}) {
$reCAPTCHA_error = $reCAPTCHA->{'error-codes'};
};
if ($reCAPTCHA->score >= 0.9 || (count($reCAPTCHA_error) === 1 && $reCAPTCHA_error[0] === 'timeout-or-duplicate')) {
// たぶん人間なので送信とかの処理
} else {
// ボットかも
}
}
ただこれだとタイムアウトエラーが出ていたらscore関係なくtrueになってしまいます。
recaptureはタイムアウトエラーになるとscoreが消えてしまうので仕方ないみたいです。
##効いてるか確認
参考させていただきました
https://norando.net/recaptcha-v3_timeout-or-duplicate/
https://blog.4breaker.com/2020/02/29/post-358/