未経験からでもWEBエンジニアになれるブログ(さぼり気味)

可能な限り楽して生きていきたい。好きなものだけ食べて痩せたい。控えめに行っても玉の輿乗りたい。ほんとはプライベートブログにしたい。何もしてないのに尊敬されたい。家から出たくない。

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が生成するすべてのフォームや
Ajaxリクエストで自動的にセキュリティトークンを含めるもの
 
もしセキュリティトークンが想定されている値と一致しなければエラー吐きます
 
 
↓これが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
 
------------------------------------------------------------------------------------------------
↑この赤い部分について調べてみたよ
 
 
・普段特に意識していない、railsフレームワークについてのセキュリティ対策文
・protect_from_forgery メソッドがコントローラーに記述されていると、
    CSRF対策が有効になるらしい
 
 
つまるところの不正な行為のこと(アクセス回数稼ぎとか)
 
この攻撃は被害者が対象のアプリケーションで認証済みになっている時
ログインしたのに他のタブ開いてログインし直すとか、そういうちょっとした不正行為ね
こう言う時に役に立つそうな。
 
 
controllerでprotect_from_forgeryを呼び出すと
verify_authenticity_token メソッド 
verify_same_origin_request メソッド
これらが呼び出され、フィルターがかかる
(全て該当コントローラにて展開)
 
---------------------------------------------------------------------------------------------------
 
■verify_authenticity_token メソッド
 
HTTPリクエストのヘッダーやボディに入っているCSRF対策用トークンの値を検証するメソッド
 
このメソッドが呼ばれると
内部でverified_request?メソッドを呼び出しリクエストが正当かどうかの判断を行う
 
 
---------------------------------------------------------------------------------------------------
[検証内容]
 
①設定ファイルで config.application_controller.allow_forgery_protectionをfalseに設定しているか 
(config.action_controller.allow_forgery_protection は、CSRF保護をオンにするかどうかを指定する。testモードではデフォルトで false、それ以外では true に設定)
 
②リクエストのHTTPメソッドはGET,HEADであるか
(トークンチェックの対象リクエスト→POST PUT DELETE PATCH 
トークンチェックを行わない理由 →GET, HEAD, OPTIONS, TRACE 
これらがチェック対象外となっている理由は、アプリケーションの状態を変更するようなリクエストを実行するためのメソッドではないため)
 
③セッション変数 _csrf_token の値とリクエストボディの authenticity_token の値を比較した結果、正しいと判断されるか 
④セッション変数 _csrf_token の値とリクエストヘッダーの X-CSRF-Token の値を比較した結果、正しいと判断される
(params[:authenticity_token]またはrequest.headers['X-CSRF-Token’]が
session[:_csrf_token]と一致しているかどうかが、CSRFトークンの検証の本体なので)
 
---------------------------------------------------------------------------------------------------
 
リクエストが正常に終了→処理は完了して通常フローへ
エラー→リクエストからセッション情報をリセット

 

 

他の方のブログやコードリーディング等々参考にさせていただきつつ、、、