Rails3.x 系ではCSRFの挙動に気をつけましょう

こんばんは,@h3_potetoです.

CSRFとは,Cross site request forgeriesの略で,入力フォームなどで,外部からPOSTできてしまうという脆弱性を点いた攻撃です.
Rails2.0以降,Railsの生成するフォームでは自動的にCSRFトークンが含まれており,POSTに関しては自動的にCSRF対策がなされています.

そのため,最近のRailsでは,普通にフォームを作って普通にPOSTして処理を実装している限り,あまり意識せずに対策されています.

ただし,このCSRFで引っかかった際の挙動には気を配っておく必要があります.

CSRFのチェックに関しては,こちらのサイトで解説されています. http://qiita.com/naoty_k/items/ce037ea79bb5893f2b89

これはRails3.x系の処理であり,実は2.x系や4.x系とも異なっています.

以下のメソッドでチェックしています.

エラーが出た際は,handle_unverified_requestが呼ばれていますね.

この通り,Rails3.x系では,CSRFにひっかかる(つまりCSRFトークンの値が一致しない)場合には,reset_sessionをかけるだけであり,createメソッド内の処理は実行されてしまう. そのアクションでsessionを見たりする必要がなければ,スルーしてcreateされる可能性は十分にありますね.

ちなみに,ログインフォーム等のように,sessionをしっかり見なければならないような機能を実装している場合は,reset_sessionであっても問題なさそうですね. ただそれ以外のフォームの場合は,どういう動作になるのかよく考えておいた方がいいです.

ログを見ると,

WARNING: Can't verify CSRF token authenticity

となっている場合があるので,その際はフォームを見直しましょう.

このあたり,Rails4.x系を使っているとしっかりエラーを出してくれるらしいので,移行したら安心できそうですね.