PHP フォームメールを作った時のメモ
久々にPHPでフォームメールを作ることがあったので、ざっくりと大切なことのメモ。
フォームをサイトにつける時は WordPress のプラグインだよりだったので、色々AI に聞きながら作った。
セキュリティで実装した方がいいこと
CSRFトークン
CSRFトークンは、Cross-Site Request Forgery(クロスサイトリクエストフォージェリ)攻撃を防ぐためのセキュリティ機能。
フォーム表示時にサーバーがランダムな文字列(トークン)を生成し、フォームに隠しフィールドとして埋め込む。
フォーム送信時に送信されたトークンがサーバーで生成したものと一致するかチェックする。
CSRFトークンにより、正規のフォームからの送信のみを受け付け、外部サイトからの不正なリクエストを防ぐことができる。
CAPTCHA
- スパム防止:自動化されたボットによる大量の迷惑投稿を防ぐ
- 不正アクセス防止:ブルートフォース攻撃(総当たり攻撃)を防ぐ
- リソース保護:サーバーへの過度な負荷を防ぐ
Google の reCAPTCHA が有名だが、簡易的画像キャプチャは PHP で実装できる。
Honeypot
人間には見えないが、ボットが自動入力してしまう「おとり」のフィールド。
- 隠しフィールドを設置:CSSで人間には見えないようにする
- ボットが自動入力:機械は全てのフィールドを埋めようとする
- 値が入っていたら拒否:人間なら空のはずなので、入力があればボット判定
所要時間チェック
フォームの表示から送信までの時間を測定して、人間では不可能な短時間での送信をボット判定する。
- 人間:フォームを読んで入力するのに数秒はかかる
- ボット:瞬時に全フィールドを埋めて送信する
- 判定:あまりにも早い送信はボットとして拒否
送信回数制限
一定時間内フォームを送信できる回数を制限する。
例)10分間に4回までなど、それ以上は制限エラーで送信拒否
- スパム攻撃の防止:大量の迷惑メール送信を阻止
- DoS攻撃の軽減:サーバーリソースの過度な消費を防ぐ
- ボット攻撃の対策:自動化された不正送信を制限
- サーバー負荷軽減:メール送信処理の過負荷を防ぐ
入力値のチェック
入力項目にあったサニタイズやバリデーションをする。
エラーログ出力
スパムとして判定した内容や時間をエラーログとして保存する。
ただ、これらを複合的に合わせてやっても完全に防ぐことはできない。