Rails5のapplication_contorollerに書いてあるprotect_from_forgery with: :exceptionとはなんぞや
rails触り始めてまだ2ヶ月も経ってない、ペーペーです
だいたいMVCの流れとかわかって来て、簡単なエラー解決くらいはできるようになったんだけども、大切なところからは未だに目を背けがちなので、、、、、
深堀ってみるのもありかなと思いまして、
ブログ再開と致します*ˊᵕˋ*
今日はこれ
application_contoroller内に書いてある
protect_from_forgery with: :exception
こいつはなんぞや
ということについて調べていきます
これを結論から言うと、
railsのセキュリティ対策に必要な一文
くらいの感じなんですけど、違うかな
protect_form_forgreyについて調べてみた
protect_from_forgery with: :exception
これはRailsが生成するすべてのフォームや
もしセキュリティトークンが想定されている値と一致しなければエラー吐きます
↓これがapplication_controllerの中身ね
----------------------------------------------------------------------------------------------
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
end
------------------------------------------------------------------------------------------------
↑この赤い部分について調べてみたよ
・protect_from_forgery メソッドがコントローラーに記述されていると、
CSRF対策が有効になるらしい
つまるところの不正な行為のこと(アクセス回数稼ぎとか)
この攻撃は被害者が対象のアプリケーションで認証済みになっている時
ログインしたのに他のタブ開いてログインし直すとか、そういうちょっとした不正行為ね
こう言う時に役に立つそうな。
controllerでprotect_from_forgeryを呼び出すと
↓
verify_authenticity_token メソッド
verify_same_origin_request メソッド
これらが呼び出され、フィルターがかかる
(全て該当コントローラにて展開)
---------------------------------------------------------------------------------------------------
■verify_authenticity_token メソッド
このメソッドが呼ばれると
↓
内部でverified_request?メソッドを呼び出しリクエストが正当かどうかの判断を行う
---------------------------------------------------------------------------------------------------
[検証内容]
①設定ファイルで config.application_controller.allow_forgery_protectionをfalseに設定しているか
(config.action_controller.allow_forgery_protection は、CSRF保護をオンにするかどうかを指定する。testモードではデフォルトで false、それ以外では true に設定)
②リクエストのHTTPメソッドはGET,HEADであるか
トークンチェックを行わない理由 →GET, HEAD, OPTIONS, TRACE
これらがチェック対象外となっている理由は、アプリケーションの状態を変更するようなリクエストを実行するためのメソッドではないため)
(params[:authenticity_token]またはrequest.headers['X-CSRF-Token’]が
---------------------------------------------------------------------------------------------------
リクエストが正常に終了→処理は完了して通常フローへ
エラー→リクエストからセッション情報をリセット
他の方のブログやコードリーディング等々参考にさせていただきつつ、、、