PHP フォームメールを作った時のメモ

久々にPHPでフォームメールを作ることがあったので、ざっくりと大切なことのメモ。

フォームをサイトにつける時は WordPress のプラグインだよりだったので、色々AI に聞きながら作った。

セキュリティで実装した方がいいこと

CSRFトークン

CSRFトークンは、Cross-Site Request Forgery(クロスサイトリクエストフォージェリ)攻撃を防ぐためのセキュリティ機能。

フォーム表示時にサーバーがランダムな文字列(トークン)を生成し、フォームに隠しフィールドとして埋め込む。
フォーム送信時に送信されたトークンがサーバーで生成したものと一致するかチェックする。

CSRFトークンにより、正規のフォームからの送信のみを受け付け、外部サイトからの不正なリクエストを防ぐことができる。

CAPTCHA

  • スパム防止:自動化されたボットによる大量の迷惑投稿を防ぐ
  • 不正アクセス防止:ブルートフォース攻撃(総当たり攻撃)を防ぐ
  • リソース保護:サーバーへの過度な負荷を防ぐ

Google の reCAPTCHA が有名だが、簡易的画像キャプチャは PHP で実装できる。

Honeypot

人間には見えないが、ボットが自動入力してしまう「おとり」のフィールド。

  1. 隠しフィールドを設置:CSSで人間には見えないようにする
  2. ボットが自動入力:機械は全てのフィールドを埋めようとする
  3. 値が入っていたら拒否:人間なら空のはずなので、入力があればボット判定

所要時間チェック

フォームの表示から送信までの時間を測定して、人間では不可能な短時間での送信をボット判定する。

  • 人間:フォームを読んで入力するのに数秒はかかる
  • ボット:瞬時に全フィールドを埋めて送信する
  • 判定:あまりにも早い送信はボットとして拒否

送信回数制限

一定時間内フォームを送信できる回数を制限する。
例)10分間に4回までなど、それ以上は制限エラーで送信拒否

  • スパム攻撃の防止:大量の迷惑メール送信を阻止
  • DoS攻撃の軽減:サーバーリソースの過度な消費を防ぐ
  • ボット攻撃の対策:自動化された不正送信を制限
  • サーバー負荷軽減:メール送信処理の過負荷を防ぐ

入力値のチェック

入力項目にあったサニタイズやバリデーションをする。

エラーログ出力

スパムとして判定した内容や時間をエラーログとして保存する。

ただ、これらを複合的に合わせてやっても完全に防ぐことはできない。

ページの先頭へ