1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スパム対策:google reCAPTCHAの設置

Last updated at Posted at 2021-04-10

自分のための忘備録です。

reCAPTCHAとは

google reCAPTCHAとはフォーム送信の際に画像認証などを用い、botを防ぐ仕組み。
V2V3がある。

v2とv3の違い

V2・・・画像認証が出てチェックさせる。フォーム送信に手間がかかる。
V3・・・フォームでの挙動から自動でbotか判断する。フォーム送信に手間がかからないが、効いてるのかいまいち分からない。

設置方法

①まずgoogleアカウントを作り、ダッシュボードでプロジェクトを作っておく
上の「Google Cloud Platform」の横にあるところから「新しいプロジェクト」

②reCAPTCHAを設置したいドメインを登録して、v2かv3を選んでキーをもらう
サイトキーとシークレットキーがある。

##v2の設置コード

htmlだけで済ませたいならこちら

htmlとphpで処理を分けるならこちら

##v3の設置コード

##v3設置してて問題点が出てきた
どうやらreCAPTCHAはトークンを取得して5分経つとタイムアウトエラー出るみたいです。

##タイムアウトエラー対策
タイムアウトエラーだけ無視できるようにちょっと変更します。
ついでに条件を「スコアが0.9以上なら成功」に変更

フォームのphp
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/

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?