reCAPTCHA V3設置(HTMLとPHP,jsで設置)

reCAPTCHA V3の設置と使い方

reCAPTCHA V3からは画像の認識は無くチェックできるようになった。セキュリティレベルが低い場合は、再度Submitする際に画像などの認証が必要になる。

reCAPTCHA V3をjsでHTMLに設置していく。

以下からreCAPTCHAの設定を行い、公式の説明を確認しながら、jsをHTMLに設置していく。 reCAPTCHA の設定はここでは省略する。

reCAPTCHA 管理画面(Googleログイン必須)

実装する上での注意点

指定のAPI jsを読み込む。

読み込みが2分以内でないとタイムアウトエラーになる。

phpのfile_get_contentsで、外部URLへの接続が許可

php.iniの設定でallow_url_fopen=onに変更・再起動する必要がある。

公式サイトの説明

formへのreCAPTCHA V3設置

HTML


<!-- //HTMLでformに以下のinputを追加する。jsでIDを取得しているのでrecaptchaResponseを統一する。-->$_COOKIE
<input type="hidden" name="recaptchaResponse" id="recaptchaResponse" />

Java Script


<!-- reCAPTCHA V3 -->
<script src="https://www.google.com/recaptcha/api.js?render=(管理画面のreCAPTCHA_sitekey)"></script>
<script>
  //コールバック時の処理
  var onloadCallback = function() {
    grecaptcha.ready(function() {
      grecaptcha.execute('<?php echo $reCAPTCHA_sitekey; ?>', {action: 'homepage'}).then(function(token) {
        var recaptchaResponse = document.getElementById('recaptchaResponse');
        recaptchaResponse.value = token;
      });
    });
  }//
</script>

formページからaction移行先ページでの処理

Java Script


<!-- reCAPTCHA応答 -->
<script type="text/javascript">
  var onloadCallback = function() {
    grecaptcha.render('html_element', {
      'sitekey' : 'your_site_key'
    });
  };
</script>

PHP


/*
* 応答とPHPのPOSTで受け取る場合
*  以下を<form action="ページ先に設置">
*  (単一ウィジェットの場合)
*/
if (isset($_POST['recaptchaResponse']) && !empty($_POST['recaptchaResponse'])) {
    $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.(管理画面のreCAPTCHA_sitekey).'&response='.$_POST['recaptchaResponse']);
    $reCAPTCHA = json_decode($verifyResponse);
    if ($reCAPTCHA->success) {
        // たぶん人間
    } else {
        // ボットかも
          return;//何もしないで返す
    }
}//

返り値

Java Script



//応答:JSON型で返される。WEBの応答
{
  "success": true|false,
  "challenge_ts": timestamp,  // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
  "hostname": string,         // the hostname of the site where the reCAPTCHA was solved
  "error-codes": [...]        // optional
}

//応答:Android
{
  "success": true|false,
  "challenge_ts": timestamp,  // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
  "apk_package_name": string, // the package name of the app where the reCAPTCHA was solved
  "error-codes": [...]        // optional
}

セキュリティレベル

success:trueであれば成功

セキュリティレベルの数値が1は安全、0.5から危険要素が高いと判断する。

success:trueでも0.5以下は再度チェックするなりの手段が必要。

reCAPTCHAを1ページ内の複数のFORMへの実装する

(処理方法を変えた複数のウィジェットにする場合)

1つのページ内に複数のinputタグがある、又は、複数のSubmitボタンがある場合のreCAPTCHAの設置はウィジェット化する。

HTML


<html>
  <script>
    // reCAPTCHAコールバック時の処理
    var verifyCallback = function(response) {
      alert(response);
    };
    var widgetId1;
    var widgetId2;
    var onloadCallback = function() {
      //レンダリングDIVエリアのid
      widgetId1 = grecaptcha.render('reCAPTCHA_set01', {
        'sitekey' : 'your_site_key',
        'theme' : 'light'
      });
      widgetId2 = grecaptcha.render(document.getElementById('reCAPTCHA_set02'), {
        'sitekey' : 'your_site_key'
      });
      grecaptcha.render('reCAPTCHA_set03', {
        'sitekey' : 'your_site_key',
        'callback' : verifyCallback,
        'theme' : 'dark'
      });
    };
  </script>

  <body>


    <!-- The g-recaptcha-response string displays in an alert message upon submit. -->
    <!-- 送信時にg-recaptcha-response文字列がアラートメッセージに表示されます。 -->
    <form action="javascript:alert(grecaptcha.getResponse(widgetId1));">
      <div id="reCAPTCHA_set01"></div>
      <br>
      <input type="submit" value="getResponse">
    </form>
    <br>


    <!-- Resets reCAPTCHA widgetId2 upon submit. -->
    <!-- 送信時にreCAPTCHAウィジェットID2をリセットします。 -->
    <form action="javascript:grecaptcha.reset(widgetId2);">
      <div id="reCAPTCHA_set02"></div>
      <br>
      <input type="submit" value="reset">
    </form>


    <br>

    <!-- POSTs back to the page's URL upon submit with a g-recaptcha-response POST parameter. -->
    <!-- g-recaptcha-response POSTパラメータを使用して、送信時にページのURLにPOSTします。 -->
    <form action="?" method="POST">
      <div id="reCAPTCHA_set03"></div>
      <br>
      <input type="submit" value="Submit">
    </form>


    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>

  </body>
</html>

実装のまとめ

formページ、移行先ページ、エラー若しくはセキュリティレベルが低いときの処理ページ、最低3つで設置が出来る。

タイトルとURLをコピーしました