TransmitMail のバリデーションチェックをサーバサイドに移行
New カテゴリー: HTML/CSS/JS
PHP で動作する汎用メールフォーム TransmitMail ですが、バリデーション項目を次のように hidden フィールドで設定します。
<input type="text" name="メールアドレス" value="{$メールアドレス}">
<input type="hidden" name="required[]" value="メールアドレス">
<input type="hidden" name="email[]" value="メールアドレス">
これでは、ブラウザのデベロッパーツールで HTML を編集したり、あるいはメールフォームを直接叩けば必須項目等のバリデーションを無視して突破できてしまいます。
セキュリティ的に問題がある場合がありますので、設定ファイルでバリデーション項目を設定し、サーバ側(PHP)でバリデーションチェックをするようにしました。
プログラムのメインファイルの TransmitMail.php には、すでに PHP によるバリデーション処理が実装されていますが、チェック対象を hidden フィールドの required などの値を取得していますので、hidden フィールドを削除するとバリデーションチェック自体が実行されなくなります。
そこで、各フォームの設定ファイルでバリデーション対象とルールを定義し、TransmitMail.php でバリデーションルールの処理、入力値の検証、エラー判定を行うようにしようと考えました。
ChatGPT に条件を示してコードを作成してもらい、エラー判定やエラーメッセージの出力等、何度か検証を重ねて完成した改修版 TranmitMail.php がこちら。(ZIP形式にしてあります)
TranmitMail.php(改修版)をダウンロード [zip: 15KB]
ついでに、バリデーションに日本語を含むかどうかのチェックを追加しました。
また、以前このブログで紹介した Reply-To ヘッダを設定する 記述も反映してあります。
次に設定ファイルです。
オリジナルの TransmitMail では設定ファイルに config.yml や config.json も使えますが、今回は config.php を使用し、以下のようにバリデーション対象とルールを定義します。
$config['validation'] = array(
'お名前' => array(
'required',
),
'電話番号' => array(
'required',
'num_hyphen',
),
'メールアドレス' => array(
'required',
'email',
'match' => 'メールアドレス確認',
),
'メールアドレス確認' => array(
'required',
),
'お問い合わせ内容' => array(
'required',
'len' => '1-1000',
'japanese',
),
);
config.yml 以外の設定ファイルを利用する場合は、index.php の $tm->init('config/config.yml'); の部分を config.php に変更する必要があります。
なお、input.hml に冒頭のように hidden フィールドでバリデーション項目を設定していましたが、これは削除して構いません。エラー表示の記述や confirm.html などその他のファイルはこれまで通りです。
※本改修版 TransmitMail.php はすべての環境で動作を保証するものではありません。導入にあたっては、ご自身の責任においてバックアップを取ってからご使用ください。