Transmitmail(お問い合わせフォーム)にGoogle reCAPTCHA v3を設置する方法
カテゴリ:WEB制作
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で行っています。