WEB制作、マーケティングに関する情報をお届けします。ホームページ制作会社、テラのブログ

Transmitmail(お問い合わせフォーム)にGoogle reCAPTCHA v3を設置する方法

TransmitmailはPHP5.6以上で動作するMITライセンスのメールフォームです。
最新版はv2.6.2でコードはこちらよりダウンロードできます。
最終更新は2022年頃でGoogle reCAPTCHAには対応していないようです。
Google reCAPTCHAはコンピュータを操作しているのが人間かボットかを見分けるシステムです。
お問い合わせフォームを設置していると度々、ボットによる攻撃を受けることがあります。
今回はこのGoogle reCAPTCHA v3をTransmitmailに導入する方法を説明します。
Transmitmailの設置方法についてはこちらに説明がありますので割愛します。

form内にGoogle reCAPTCHAのフィールドを設置する

input.html内のformタグ内に以下をフィールドを設置します。

<input type="hidden" id="g-recaptcha-response" name="g-recaptcha-response">

Javascriptを設置

APIの読み込みとページを読み込む際にトークンを取得します。
footerやheaderなどに以下のコードを設置してください。

<script src="https://www.google.com/recaptcha/api.js?render=サイトキーを入力"></script>
<script>
  grecaptcha.ready(function() {
      grecaptcha.execute('サイトキーを入力', {action: 'submit'}).then(function(token) {
         document.getElementById('g-recaptcha-response').value = token;
      });
  });
</script>

フォームの動作部分を改修する

lib/TransmitMail.phpにGoogle reCAPTCHAの取得、検証などを追加します。

入力項目として除外する項目を編集

46行目に『public $exclusion_item =』という項目がありますがここに『input.html』で設置したreCAPTCHAのフィールドのname属性の値を設置します。
以下は該当箇所の変更後のソースです。

// 入力情報として除外する項目
public $exclusion_item = '[
    "x",
    "y",
    "page_name",
    "required",
    "hankaku",
    "hankaku_eisu",
    "hankaku_eiji",
    "num",
    "num_hyphen",
    "hiragana",
    "zenkaku_katakana",
    "zenkaku",
    "zenkaku_all",
    "email",
    "match",
    "len",
    "url",
    "num_range",
    "file",
    "file_remove",
    "file_required",
    "csrf_token",
    "g-recaptcha-response"
]';

913行目あたりに入力内容をセットする箇所があるのでここの中に

if (!empty($_POST['g-recaptcha-response'])) {
    $_SESSION['g-recaptcha-response'] = $_POST['g-recaptcha-response'];
}
if (isset($_SESSION['g-recaptcha-response'])) {
    $this->tpl->set('g_recaptcha_response', $_SESSION['g-recaptcha-response']);
    $hiddens[] = $this->getInputHidden('g-recaptcha-response', $_SESSION['g-recaptcha-response']);
}

1094行目にあるメールの送信を行う箇所(sendmail)に

// reCAPTCHAの設定
$recaptcha_secret = 'シークレットキーを入力';
$recaptcha_response = $_POST['g-recaptcha-response'];
    
// reCAPTCHAの検証
$recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify';
$recaptcha_data = array(
    'secret' => $recaptcha_secret,
    'response' => $recaptcha_response
);
    
$options = array(
    'http' => array(
        'method' => 'POST',
        'header' => "Content-type: application/x-www-form-urlencoded\r\n",
        'content' => http_build_query($recaptcha_data),
    )
);
    
$context = stream_context_create($options);
$response = file_get_contents($recaptcha_url, false, $context);
$result = json_decode($response, true);

// デバッグ情報の出力
error_log(print_r($result, true));
    
if (!($result['success'] && $result['score'] >= 0.5)) {
    // reCAPTCHA検証に失敗した場合、エラーメッセージを表示して終了
    echo 'reCAPTCHAの検証に失敗しました。もう一度お試しください。';
    exit; // スクリプトを終了
}

ファイルの編集は以上です。

検証について

まず右下にreCAPTCHAのアイコンが出ているか確認しましょう。
実際に問い合わせフォームを動作させます。
そのあと、Google reCAPTHAのv3 Admin Consoleに入ってリクエスト回数を確認してください。(タイムラグがありますので翌日に確認しましょう。)
カウントが入っていれば無事に稼働しています。

※本記事の動作確認はPHP8.3で行っています。

テラ合同会社(東京都)

テラは2014年に東京都でスタートアップしたホームページ制作会社です。ホームページ制作以外にも広告運用、マーケティング、ブランディング、印刷物など幅広い領域をサポートしています。
コーポレートサイトはこちらをご覧ください。