web-dev-qa-db-ja.com

Rails 4 APIアクションのprotect_from_forgeryをスキップ

APIを使用してRails 4アプリケーションを実装しています。携帯電話とwebapp自体からAPIを呼び出すことができるようにしたいです。 このノート 調査中protect_from_forgery

XMLまたはJSONリクエストも影響を受けることを忘れないでください。APIを構築する場合は、次のようなものが必要です。

class ApplicationController < ActionController::Base
  protect_from_forgery
  skip_before_action :verify_authenticity_token, if: :json_request?

  protected

  def json_request?
    request.format.json?
  end
end

私はこれを行うことを考えていましたが、いくつかの予約/質問があります:

  1. このソリューションは、攻撃者がJSONをポストするonclick javascriptを使用してリンクを作成できるため、CSRFの穴を開いたままにしているようです。
  2. APIトークンを確認するのは合理的な代替手段でしょうか?つまり、真正性チェックをスキップする代わりに、チェックに失敗してhandle_unverified_request AP​​Iトークンが存在し、現在のユーザーに対して正しい場合は?
  3. または、webappとモバイルデバイスに HTTPヘッダー にCSRFトークンを送信するだけですか?それは安全ですか?そもそもHTMLフォームをレンダリングしていない場合、携帯電話はどのようにCSRFトークンを取得するのでしょうか?

説明のために編集:

Webappユーザーが細工されたCSRFリンクをクリックすることをもっと心配しています。モバイルユーザーは認証、承認され、APIキーを持っているので、私はそれらについて心配していません。ただし、webappユーザーのCSRF保護を有効にすると、モバイルユーザーは保護されたAPIを使用できなくなります。これを処理するための正しい戦略を知りたいのですが、Railsのドキュメントが正しい答えを与えるとは思わない。

31
Chris Cameron

攻撃者は好きなようにコントローラーでCURLを実行できますが、APIに認証が必要な場合、どこにもアクセスできません。

APIコンシューマーにCSRFを送信させることは、実際にはCSRFが行うことではありません。これを行うには、クライアントが最初に認証エンドポイントにアクセスしてコード(別名CSRF)を取得し、POSTで送信する、一種のノッキングメカニズムを実装する必要があります。モバイルクライアントの帯域幅と電力を使用し、時間がかかるため、これはモバイルクライアントにとって好ましくありません。

とにかく、実際に偽造(つまり、CSRFのF)が承認されたクライアントがコントローラーにヒットした場合はどうでしょうか?

9
Oren Mazor

実際、HTTPFヘッダーでCSRFトークンを送信することは一般的なアプローチです。クライアントが何らかの形で有効なトークンを取得したことを確認します。たとえば、作成されたCSRFリンクは資格情報Cookieで送信されますが、ヘッダーにはCSRFトークンは含まれません。クライアント上の独自のjavascriptはドメインCookieにアクセスし、すべてのXHRリクエストでCookieからヘッダーにトークンをコピーできます。

AngularJSはこのアプローチに従います ここで説明

最初の2つの質問について:

  1. このソリューションは、CSRFの穴を開いたままにするようです...

実際、これもAPIでCSRFトークンを無効にしない理由です。

  1. APIトークンを確認するのは合理的な代替手段でしょうか? ...

おそらくない。以下を考慮してください( [〜#〜] owasp [〜#〜] から):

GETリクエストのCSRFトークンは、ブラウザの履歴、HTTPログファイル、HTTPリクエストの最初の行を記録するようにポイントするネットワークアプライアンス、保護されたサイトが外部サイトにリンクしている場合のリファラーヘッダーなど、いくつかの場所でリークする可能性があります。

一般的な推奨事項:車輪を発明しようとしないでください。 OWASPには REST Security Cheat Sheet というページと、以前リンクしたページがあります。 Angularアプローチ(各XHRリクエストでCookieからヘッダーにトークンをコピーする)アプローチに従うことができます。また、通常の非ajaxフォームでは、必ずPOSTおよび静的サーバーフォームのCSRF保護で通常行われる隠しフィールド。

6
sinelaw