じぶんメモ

プログラミングのメモ、日常のメモとか。

AjaxにおけるCSRF対策

HTTPヘッダのX-requested-withの値をチェック?

HTTPヘッダのX-requested-withの値が、Ajax通信を示す「xmlhttprequest」であることを確認する。
SameOriginPolicyより、Ajax通信では、不正な外部ドメインからのアクセスはできない。

SameOriginPolicyとは

「スキーム、ホスト、ポート」の組み合わせをオリジンと定め、
それらが同じものは同一のリクエストだと認識すること。
ここではAjaxはクロスドメイン通信を許可していないため、
Ajaxを使ったCSRFは不可能だとか。
ただし、JSONPXMLHttpRequest Level2など
異なるドメインへのリクエストを行う方法は存在する。
また、X-requested-withは操作することも可能。

トークンを使用するのがベター

Ajax通信においてもトークンを使用するのが好ましいらしい。
認証は以下の流れ。

1)サーバーでセッションID等を使用し一意となるトークンを作成し、
セッションオブジェクトに格納。

2)hiddenフィールドにトークンを格納したレスポンスをクライアントへ送信する。
(キャッシュが残らないようにすること。)

3)クライアントでデータをPOSTし、POSTされたhiddenの値と、
1)で作成したトークンが合致していればOK。合致しない場合はエラー。

4) セッションオブジェクトのトークンを破棄する。