状況
会員のメールアドレスを変更するフォーム。サーバーはセッション Cookie だけでログイン中の会員を判定し、POST を受けたらそのまま変更している。
この処理に欠けている対策は?
<form method="POST" action="/account/email"> <input name="email" type="email"> <button>変更する</button></form>正答
- 推測できないトークンをフォームに埋め込み、POST のときに照合する
- 入力されたメールアドレスの形式を、サーバー側でも正規表現で検査する
- Cookie に HttpOnly 属性を付け、JavaScript から読めなくする
- 送信ボタンを二度押しできないよう、押したら無効にしておく
解説
ブラウザによっては、別のサイトから送られたフォームにも宛先のサイトの Cookie を付ける。ログイン中の会員が罠のページを開くと、そこから /account/email へ POST され、本人の操作としてメールアドレスを書き換えられる(CSRF)。対策は、セッションごとに推測できないトークンをフォームに埋め込み、受け取ったときに照合する。SameSite 属性は未指定のときの扱いがブラウザで違うので、明示したうえで補助として使う。HttpOnly は JavaScript から Cookie を読めなくするだけで、送信は止めない。形式の検査や二度押しの防止も CSRF とは別の問題。
参考: www.ipa.go.jp
この問題を含む セキュリティ のテストを制限時間つきで解く
セキュリティクイズへ