※社内専用

reCaptcha v3導入方法(シード/リミテッド対応)

reCaptcha v3をPHPでできた問い合わせフォームに導入する方法。
参考サイト:https://stevencotterill.com/articles/adding-google-recaptcha-v3-to-a-php-form   今回は入力画面確認画面に設置する

recaptcha.jsファイルを作成する

設置場所

assets/js/直下

ファイル内容

"use strict";
var site_key;
function set_site_key(key) {
  site_key = key;
}
var form = document.querySelector('form.inquiry');
form.addEventListener('submit', function (event) {
  event.preventDefault();
  grecaptcha.ready(function () {
    try {
      grecaptcha.execute(site_key, {
        action: 'inquiry'
      }).then(function (token) {
        //トークン取得が成功した場合
        var input = document.createElement('input');
        input.type = 'hidden';
        input.name = 'recaptcha_token';
        input.value = token;
        form.appendChild(input);
        form.submit();
      }, function (reson) {
        //トークン取得が失敗した場合
        console.log("reCaptchaトークン取得に失敗しました。");
      });
    } catch (error) {
      console.log("reCaptchaの処理に失敗しました。");
    }
  });
});

view/footer.phpを編集する

main.jsの記述の直下に下記を追記
RECAPTCHA_SITE_KEYサイトキーで置き換える(2箇所)
<script src="https://www.google.com/recaptcha/api.js?render=RECAPTCHA_SITE_KEY"></script>
<script src="../assets/js/recaptcha.js"></script>
<script>set_site_key('RECAPTCHA_SITE_KEY');</script>

src/confirm_controller.phpを編集する

最下部に下記を追記
RECAPTCHA_SECRET_KEYシークレットキーで置き換える
if ($_SERVER['REQUEST_METHOD'] === 'POST' 
    && isset($_POST['recaptcha_token'])) {

  $url = 'https://www.google.com/recaptcha/api/siteverify';
  $url .= '?secret=';
  $url .= 'RECAPTCHA_SECRET_KEY';
  $url .= '&response=';
  $url .= $recaptcha_token;
  $recaptcha = file_get_contents($url);

  if ($recaptcha === false) {
    // Googleとの通信に失敗
    header('HTTP', true, 500);
  }

  $recaptcha = json_decode($recaptcha);

$_SESSION
["score"] = $recaptcha->score;

if ($recaptcha === null) { // Googleからの応答が有効なJSONではない header('HTTP', true, 500); } if ($recaptcha->success === false) { // リキャプチャの検証にGoogle側が失敗 header('HTTP', true, 500); } if ($recaptcha->score < 0.29) { header('HTTP', true, 403); } }

src/submit_controller.phpを編集する

メール送信処理(52行目付近)の直前に下記を記述
/*--------------------------------------*/
//スパムメール対策
/*--------------------------------------*/
//スパムメールを受信した場合、処理を終了させる
if (empty($_SESSION["score"])) {
  exit("スパムメールを受信したため、プログラムを終了します。");
}