AjaxにおけるCSRF対策
HTTPヘッダのX-requested-withの値をチェック?
HTTPヘッダのX-requested-withの値が、Ajax通信を示す「xmlhttprequest」であることを確認する。
SameOriginPolicyより、Ajax通信では、不正な外部ドメインからのアクセスはできない。
SameOriginPolicyとは
「スキーム、ホスト、ポート」の組み合わせをオリジンと定め、
それらが同じものは同一のリクエストだと認識すること。
ここではAjaxはクロスドメイン通信を許可していないため、
Ajaxを使ったCSRFは不可能だとか。
ただし、JSONPやXMLHttpRequest Level2など
異なるドメインへのリクエストを行う方法は存在する。
また、X-requested-withは操作することも可能。
トークンを使用するのがベター
Ajax通信においてもトークンを使用するのが好ましいらしい。
認証は以下の流れ。
1)サーバーでセッションID等を使用し一意となるトークンを作成し、
セッションオブジェクトに格納。
2)hiddenフィールドにトークンを格納したレスポンスをクライアントへ送信する。
(キャッシュが残らないようにすること。)
3)クライアントでデータをPOSTし、POSTされたhiddenの値と、
1)で作成したトークンが合致していればOK。合致しない場合はエラー。
4) セッションオブジェクトのトークンを破棄する。