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