12

モバイル アプリケーションからアクセスするための REST API を使用して Rails アプリを開発しています。

それは非常にうまく機能します。ユーザーがモバイル アプリケーションからログインすると、auth_tokenAPI への今後のリクエストで使用するものを取得します。問題は、パス /api/v1/... に移動することで Web からも API にアクセスできることです。このため、CSRF から保護する必要があります。

「有効」になっているBaseApiControllerクラスを継承し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.

私の質問は次のとおりです: API が安全であることを保証する方法と、GET 以外のリクエストを実行するときに警告を削除する方法は?

これは私が思いついた解決策の 1 つですが、ハックのように見え、追加の DB クエリを 1 つ実行します。

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

プロジェクトの詳細: Rails 3.2.14、Devise、AngularJS。プロジェクトのソース コードはここにあります。

4

1 に答える 1

8

CSRF は API リクエストの問題ではないと示唆する人がいるかもしれません (そもそも状態がないので、とにかくハイジャックする必要があるのでしょうか?)。そのため、単純に警告を排除するために次のように提案する人もいます。

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

text/plainただし、さまざまな Flash や Java ベースの方法を使用して、CSRF をコミットすることが可能であるというコメントがありました。しばらく前に Rails にセキュリティ パッチが適用されたのはそのためだと思います: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/

いずれにせよ、認証トークンを実際にチェックする優れたソリューションは、次の場所にあります:警告: CSRF トークン認証レールを検証できません

リクエストに実際にヘッダーを設定する必要があります。

幸運を!

于 2013-08-22T13:43:55.907 に答える