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 はすべての環境で動作を保証するものではありません。導入にあたっては、ご自身の責任においてバックアップを取ってからご使用ください。