2015-12-10 8 views
5

私はAPIを使ってモバイルアプリを提供するRails 4アプリを開発しており、管理者がアプリケーションを管理するためのWeb UIを持っています。また、ユーザーに表示されるいくつかのWebページ(成功した電子メールの確認とリセットパスワード)もあります。RailsアプリケーションWebとAPIでprotect_from_forgeryを正しく使用する

私は2つのコントローラセットを作成しました.1つはAPIControllerから継承し、もう1つはAdminControllerから継承しました。どちらもApplicationControllerを継承しています。ユーザーが直面しているWebページを担当する残りのコントローラもApplicationControllerから継承します。

このスキームが与えられると、私はCSRF保護をprotect_from_forgeryで適切に実装する方法が不明です。私は現在次のようなことがあります:

class ApplicationController < ActionController::Base 
    # ... 
end 

module API 
    class APIController < ApplicationController 
    protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' } 
    # ... 
    end 
end 

module Admin 
    class AdminController < ApplicationController 
    protect_from_forgery with: :exception 
    # ... 
    end 
end 

class UsersController < ApplicationController 
    protect_from_forgery with: :exception 
    # ... 
end 

私の質問は正しいですか?それを改善する方法はありますか?とにかくすべてのAPIリクエストはJSONだけなので、APIControllerのチェックは無意味ですか?

Brakemanは、ApplicationControllerにprotect_from_forgery呼び出しがないと訴えましたが、おそらくサブクラス内の呼び出しを見ないことがあります。

ありがとうございます!

答えて

2

あなたはそれがApplicationControllerのみ

あなたの管理者とユーザーのコントローラの有無をチェックすることhere, on their (brakeman) Github pageを見ることができますprotect_from_forgeryためのRailsの4上のデフォルトの動作が:null_sessionあるprotect_from_forgery with: :exception

で大丈夫です、あなたは削除することもできます必要ならば、オプションwith:を入力してください。

改善については、ユーザーにトークンを保存し、すべてのリクエストに一致させる方法を実装します。つまり、APIを要求するユーザーは、リクエストごとにトークンを送信する必要があります。これを行うと、CSRFトークンを取得してから、このトークンでリクエストを送信する必要がなくなります。たとえば、モバイルユーザーの場合、これは正しいトークンを保存するだけで解決できる追加要求の1つです。誰かがこのトークンを取得した場合、それはユーザーとして渡され、データを変更する可能性があります。しかし、これをより安全にする方法についてもっと多くの方法を探すことができます。

セッションやクッキーにトークンを保存するとCSRFが発生する可能性があります。そのように保存することを選択した場合は、トークンを個別に管理する必要があります。

モバイル用のAPIを使用する場合は、携帯電話(メモリまたはローカルデータベース)にトークンを保存してください。

関連する問題