CSRF対策の流れ
2016/08/29
CSRF対策が必要な状況が2つあるっぽい。表現が間違っているかもしれないけど下記の2つ。
- フォーム送信 – 画面が切り替わるタイプ
- Ajax送信 – 画面が切り替わらないタイプ
※他にもあるかもしれない。
基本はサーバー側でキーになる何かを持つ。で、ブラウザ側から送られてきたキーが一致したらOKって感じ。さらに、そのキーは1回使ったら消えてしまうタイプ。
※ここでいう「キー」がいわゆる「トークン」になるっぽい。
フォーム送信 – 画面が切り替わるタイプ
- フォームを表示するタイミングでCSRF対策のトークンを発行し、セッションに格納。
- フォームに生成したトークンを埋め込む。
- 「送信ボタン」を押す
- フォームデータのトークンとセッションのトークンを比較
- 比較後、セッションのトークンを破棄
※仮に「送信ボタン」を押さずに違うページに遷移したり、ブラウザを閉じたりしたときはセッションのトークンを破棄してあげる仕組みが欲しい。
Ajax送信 – 画面が切り替わらないタイプ
画面が変わらないのでどっかのタイミングでトークンを再生成する必要がある。
- フォームを表示するタイミングでCSRF対策のトークンを発行し、セッションとクッキーに格納。
- 「送信ボタン」を押す
- Ajaxで送信する前にクッキーからトークンを抜き出す
- Ajaxで送信した先でトークンとセッションのトークンを比較
- 比較後、セッションのトークンを再生成し、クッキーに格納
※仮に「送信ボタン」を押さずに違うページに遷移したり、ブラウザを閉じたりしたときはセッションのトークンを破棄してあげる仕組みが欲しい。