十分に長い
暗号学的に予測困難
利用者のセッションに関連付いている
状態変更リクエストすべてで検証する
トークン欠落時も拒否する
GETパラメータへ入れない
URLやアクセスログへ残さない
外部送信フォームへ埋め込まない
XSSから保護する
ログイン時などに必要に応じて更新する
PortSwiggerは、トークンをセッションへ結び付け、すべての対象リクエストで厳密に検証することを重要条件として挙げています。
サーバー側セッションにトークンを保存する方式です。
サーバーセッション
┌──────────────────┐
│ session_id: ABC │
│ csrf: XYZ123 │
└──────────────────┘
フォーム
<input type="hidden" name="csrf" value="XYZ123">
リクエスト時に、フォームの値とサーバー側セッションの値を比較します。
セッションへ確実に結び付けられる
他ユーザーのトークンを流用しにくい
実装モデルが分かりやすい
サーバー側に状態を保存する
複数タブや戻る操作との調整が必要な場合がある
リクエストごとに使い捨てると操作性が悪化する場合がある