Top > 開発ガイド > Rails Plugins > rails_protection > CSRF対策
CSRF対策
概要
- POSTリクエスト
全てのリクエストのパラメータにセッションIDをベースとするトークンを付与し、その検証を行うことでCSRF攻撃を予防します - GETリクエスト
全てのリクエストにおいてDB更新処理を禁止することでCSRF攻撃を予防します
トークンの生成方式
デフォルトの場合、トークンはセッションIDそのものとなります。必要に応じてセッションIDのダイジェスト値にすることができます。「environment.rb」等で、ダイジェスト値を生成する際のハッシュアルゴリズムを指定してください。
ENV['RAILS_PROTECTION_HASH_SESSION_ID'] = 'sha1'
指定可能なハッシュアルゴリズムは以下の通りです。
- sha1
- sha256
- sha384
- sha512
- md5
- rmd160
POSTリクエスト
フォームタグ
ActionView#form_tagメソッドをオーバーライドすることで、自動的にトークンを隠しパラメータとしてセットします。フォームタグを記述する際にヘルパメソッドを使用していれば、特に意識する必要はありません。
AJAXリクエスト対応
Prototype.jsのAjax.Request及びAjax.UpdatorはデフォルトでPOSTリクエストを利用するようになっています。そのため、トークンをパラメータとして付与する必要があります。全てのAjaxリクエストのオプションにトークンを足し込むためのヘルパメソッドを準備しました。Prototype.jsを読み込んだ後に実行して下さい。
<%= javascript_include_tag '/javascripts/prototype' %> <%= override_ajax_base_options %>
トークンの検証
before_filterで全てのPOSTリクエストのトークンを検証します。
合致しなかった場合にはRailsProtection::Csrf::SessionValidateExceptionが発行されます。
GETリクエスト
DB更新処理の禁止
ActiveRecord#saveメソッド及びActiveRecord#destoyメソッドの実行を禁止します。これらのメソッドが呼ばれるとRailsProtection::Csrf::SessionValidateExceptionが発行されます。
DB更新処理の例外的許可
どうしても必要な場合、以下のようにインスタンス変数をセットすることでGETリクエスト時にもDB更新処理を行うことができます。
tm = TestModel.find(1) tm.ignore_csrf_validation = true tm.save
Rails 2.XのCSRF対策について
Rails 2.Xで導入されたCSRF対策(request_forgery_protection)は本プラグインで提供するCSRF対策よりも緩い対策であるため、全て無効化します。rails_protectionの方式とrequest_forgery_protectionの方式の比較表を以下に記します。
| rails_protection | request_forgery_protection | ||
| GETリクエスト | 方式 対象 | DB更新処理の禁止 全アクション | 未対応 |
| POSTリクエスト | 方式 対象 | セッションIDをベースとするトークンの値を照合 全アクション | セッションに紐付くランダムな文字列の照合 コントローラで宣言したアクション |
