2013-08-22 13 views
12

私は、モバイルアプリケーションからアクセスするためのREST APIを備えたRailsアプリケーションを開発してきました。Rails APIがCSRFから保護されていることを確認するには?

非常にうまくいきます。ユーザーがモバイルアプリケーションからログインすると、彼は将来のAPIリクエストで使用するauth_tokenを取得します。問題は、APIがwebからpath/api/v1/...にアクセスすることでアクセスできることです。このため、CSRFから保護する必要があります。

ApplicationControllerから継承し、protect_from_forgeryを「有効」にしたクラスがあります。ここでは例です:

class Api::V1::BaseApiController < ApplicationController 
    # ... 
end 

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

、私は私のAPIに非GETリクエストを行う際に、auth_tokenで、私の要求は正常に完了しますが、ログには、私は有名なWARNING: Can't verify CSRF token authenticityを見ることができます。 protect_from_forgeryを私のBaseApiControllerから削除しても、明らかに警告は出ませんが、私のAPIはCSRF攻撃の脆弱性があります(protect_from_forgeryが存在しない場合、ドメイン間でデータを正常に変更する簡単なHTMLフォームを作成しました)。

私のAPIは安全であることを保証する方法ですが、GET以外のリクエストを行う際の警告も削除しますか?

は、ここで私が作ってみた解決策の一つだが、それはより多くのハックのように見え、1つの余分DBクエリを実行:プロジェクトに関する

class Api::V1::BaseApiController < ApplicationController 
    # ... 
    def verified_request? 
    super || User.where(authentication_token: params['auth_token']).count > 0 
    end 
end 

詳細:Railsの3.2.14を、工夫、 AngularJS。プロジェクトのソースコードはhereです。あなたは、人々はので、いくつかは、単に警告を排除するために、以下の提案、(?そもそも何の状態が存在しないので、とにかく乗っ取るために何があります)CSRFは、APIリクエストのための問題ではないことを示唆して表示される場合があり

答えて

8

skip_before_filter :verify_authenticity_token, :only => [:your_method] 

しかし、さまざまなFlashおよびJavaベースの方法を使用してtext/plainでCSRFをコミットすることができるというコメントがありました。いずれにしてもhttp://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

、良い解決策実際にここで見つけることができ真正トークンをチェックします:私はしばらく前にレールにそれはセキュリティパッチの理由だったと思いますこれは、実際に設定することを含むWARNING: Can't verify CSRF token authenticity rails

ヘッダーを入力してください。

幸運を祈る!

関連する問題