- 更新日: 2014年3月30日
- Rails
Rails4 で CSRF 対策を無効にする
Rails4 でCSRF 対策を無効にしたい場合、CSRF 対策を無効にするコントローラーで次のように指定します。
app/controllers/some_controller.rb
1 2 |
protect_from_forgery except: :some_action protect_from_forgery except: [:some_action1, :some_action2] |
これで、対象のコントローラーのアクションで CSRF 対策を無効にできます。
— 環境 —
rails-4.0.1
CSRF 対策を無効にできるかどうかの判断
ただし、DBに対する追加・更新・削除など恒久的なデータ変更を加える可能性のあるアクションでは、CSRF対策は無効にしないほうが良い。CSRF攻撃により意図しないデータ変更が引き起こされる可能性があるためです。
CSRFを防ぐ必要があるのは、Webアプリケーションに対して何らかの恒久的な データ変更を発生させるアクセスとなるページ(登録情報変更、設定変更、退 会処理、注文実行、取り消しなど)である。たとえば、情報を表示するだけの ページには対策が不要、もしくは重要性が低い(後述の「2ページ目」など)。 ショッピングカートへの商品追加などのように、一時的な状態変更を加えるだ けのページに対するCSRF対策の重要性は低めとなる*1。
高木先生の記事で上記のように書いてありました。情報を表示するだけのページ、ショッピングカートなどセッションを使っての一時的な状態変更だけのページであれば、CSRF対策の重要性は低めだそうです。
Rails4 では protect_from_forgery はデフォルトで有効
ちなみに、Rails4 では ApplicationController に以下のように書いてあり、デフォルトで CSRF 対策が有効になっています。たった1行で CSRF 対策がばっちりになる Rails すごい。
app/controllers/application_controller.rb
1 2 3 4 |
class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception |
HTMLソースを確認すると、GETメソッド以外(POST)のリクエストに、authenticity_token という名前の hidden field が自動的に追加されてます。
1 |
<input name="authenticity_token" type="hidden" value="*****" /> |
value の値は正しいリクエストかどうかを検証するための、ランダムな文字列のトークン。
GET 以外のメソッドで、セッション中のトークンとパラメータのトークン(params[:authenticity_token])を比較して検証し、もし一致しない場合は session をクリアする。
試してみましたところ、トークンが一致しない場合は、InvalidAuthenticityToken という例外が発生しました。
1 2 3 |
ActionController::InvalidAuthenticityToken in **** |
以上です。
- – 参考リンク –
- Turn off CSRF token in rails 3 – Stack Overflow
- protect_from_forgeryが何をやっているのか調べた – tech blog
- CSRFの対応について、rails使いが知っておくべきこと – おもしろWEBサービス開発日記
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!