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_protectionrequest_forgery_protection
GETリクエスト方式
対象
DB更新処理の禁止
全アクション
未対応
POSTリクエスト方式
対象
セッションIDをベースとするトークンの値を照合
全アクション
セッションに紐付くランダムな文字列の照合
コントローラで宣言したアクション