PHPでGoogle reCAPTCHA v3を使ってみる

reCAPTCHAとは

悪質なプログラムによるサービスへの侵入や乱用を防ぐ仕組みで、ウェブサービスに不正なログインや大量の登録、迷惑な書き込みなどを試みる悪質なプログラム(ロボット)への対策です。



reCAPTCHA v3とは

reCAPTCHA v3では、サイト閲覧者は「私はロボットではありません」というチェックをつける必要がなくなっています。

reCAPTCHA v3ではユーザーの操作を要求する代わりに、ウェブコンテンツを「スコア化」して、攻撃の危険性を可視化します。ウェブサイトを訪問したユーザーに面倒な作業を求めないのがポイントです。

また、「アクション」タグという新しいコンセプトが導入されました。このタグを使用することで、ユーザーの一連の操作における主要なステップを定義でき、コンテキストをふまえたリスク分析が可能です。

reCAPTCHA v3を導入すれば、サイト閲覧者に負担をかけることなくコンテンツをボットの攻撃から予防できるようになります。



reCAPTCHAを導入

reCAPTCHA v3を導入するためにはまずは js 読み込みやトークン取得のためのキーが必要になります。こちらからreCAPTCHA v3を導入するための登録とキーの取得が必要です。

developers.google.com

フロントエンド

<html>
<head>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script src='https://www.google.com/recaptcha/api.js?render=reCAPTCHA_site_key'></script>
</head>

<body>
  <form action="verify.php" method="post">
    <input type="text" name="name" placeholder="Your name" required>
    <input type="email" name="email" placeholder="Your email address" required>
    <button type="submit" value="SUBMIT">SUBMIT</button>
  </form>

<script>
    $('form').submit(function() {
        event.preventDefault();
        grecaptcha.ready(function() {
            grecaptcha.execute('reCAPTCHA_site_key', {action: 'homepage'}).then(function(token) {
                $('form').prepend('<input type="hidden" name="g-recaptcha-token" value="' + token + '">');
                $('form').unbind('submit').submit();
            });;
        });
    });
</script>

</body>
</html>

※「reCAPTCHA_site_key」には取得したreCAPTCHAサイトキーを入力してください。


バックエンド(verify.php)

<?php
    if(isset($_POST['g-recaptcha-token']) && !empty($_POST['g-recaptcha-token'])) {
        //your site secret key
        $secret = 'reCAPTCHA_secret _key';
        //get verify response data
        $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-token']);
        $responseData = json_decode($verifyResponse);
        print_r($responseData);
        if($responseData->success):
             print_r("Working Fine"); exit;
        else:
             print_r("No valid Key"); exit;
        endif;
    } else {
        print_r("Not Working Captcha"); exit;
    }
?>
●実行結果
・successの場合
stdClass Object
(
    [success] => 1
    [challenge_ts] => 2018-11-09T03:28:38Z
    [hostname] => hostname
    [score] => 0.9
    [action] => homepage
)
Working Fine

※「reCAPTCHA_secret_key」には取得したreCAPTCHA秘密キーを入力してください。

このサンプルでは「action」と「score」のチェックは行っておりませんが、厳密にするにはチェックしておいたほうがよいと思います。

reCAPTCHA v3は、ユーザーの一連の操作を分析し、その動きがどれぐらい不審なのかをスコア化する仕組みになっており、ユーザーによる操作は一切不要。ユーザーの行動を妨げずに利用できます。reCAPTCHA v3を複数のページに実装すれば、複数ページにわたるアクティビティを解析し、より正確にbotを判別したり、どのページがbotの標的にされているかを把握することもできるようです。