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であっても問題なさそうですね. ただそれ以外のフォームの場合は,どういう動作になるのかよく考えておいた方がいいです.
ログを見ると,
となっている場合があるので,その際はフォームを見直しましょう.
このあたり,Rails4.x系を使っているとしっかりエラーを出してくれるらしいので,移行したら安心できそうですね.