セキュリティ4 択難易度 標準

状況

会員のメールアドレスを変更するフォーム。サーバーはセッション Cookie だけでログイン中の会員を判定し、POST を受けたらそのまま変更している。

この処理に欠けている対策は?

<form method="POST" action="/account/email">  <input name="email" type="email">  <button>変更する</button></form>

正答

  1. 推測できないトークンをフォームに埋め込み、POST のときに照合する
  2. 入力されたメールアドレスの形式を、サーバー側でも正規表現で検査する
  3. Cookie に HttpOnly 属性を付け、JavaScript から読めなくする
  4. 送信ボタンを二度押しできないよう、押したら無効にしておく

解説

ブラウザによっては、別のサイトから送られたフォームにも宛先のサイトの Cookie を付ける。ログイン中の会員が罠のページを開くと、そこから /account/email へ POST され、本人の操作としてメールアドレスを書き換えられる(CSRF)。対策は、セッションごとに推測できないトークンをフォームに埋め込み、受け取ったときに照合する。SameSite 属性は未指定のときの扱いがブラウザで違うので、明示したうえで補助として使う。HttpOnly は JavaScript から Cookie を読めなくするだけで、送信は止めない。形式の検査や二度押しの防止も CSRF とは別の問題。

参考: www.ipa.go.jp

csrftokenform

この問題を含む セキュリティ のテストを制限時間つきで解く

セキュリティクイズへ