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
私はこれを行うことを考えていましたが、いくつかの予約/質問があります:
onclick
javascriptを使用してリンクを作成できるため、CSRFの穴を開いたままにしているようです。handle_unverified_request
APIトークンが存在し、現在のユーザーに対して正しい場合は?説明のために編集:
Webappユーザーが細工されたCSRFリンクをクリックすることをもっと心配しています。モバイルユーザーは認証、承認され、APIキーを持っているので、私はそれらについて心配していません。ただし、webappユーザーのCSRF保護を有効にすると、モバイルユーザーは保護されたAPIを使用できなくなります。これを処理するための正しい戦略を知りたいのですが、Railsのドキュメントが正しい答えを与えるとは思わない。
攻撃者は好きなようにコントローラーでCURLを実行できますが、APIに認証が必要な場合、どこにもアクセスできません。
APIコンシューマーにCSRFを送信させることは、実際にはCSRFが行うことではありません。これを行うには、クライアントが最初に認証エンドポイントにアクセスしてコード(別名CSRF)を取得し、POSTで送信する、一種のノッキングメカニズムを実装する必要があります。モバイルクライアントの帯域幅と電力を使用し、時間がかかるため、これはモバイルクライアントにとって好ましくありません。
とにかく、実際に偽造(つまり、CSRFのF)が承認されたクライアントがコントローラーにヒットした場合はどうでしょうか?
実際、HTTPFヘッダーでCSRFトークンを送信することは一般的なアプローチです。クライアントが何らかの形で有効なトークンを取得したことを確認します。たとえば、作成されたCSRFリンクは資格情報Cookieで送信されますが、ヘッダーにはCSRFトークンは含まれません。クライアント上の独自のjavascriptはドメインCookieにアクセスし、すべてのXHRリクエストでCookieからヘッダーにトークンをコピーできます。
AngularJSはこのアプローチに従います ここで説明 。
最初の2つの質問について:
- このソリューションは、CSRFの穴を開いたままにするようです...
実際、これもAPIでCSRFトークンを無効にしない理由です。
- APIトークンを確認するのは合理的な代替手段でしょうか? ...
おそらくない。以下を考慮してください( [〜#〜] owasp [〜#〜] から):
GETリクエストのCSRFトークンは、ブラウザの履歴、HTTPログファイル、HTTPリクエストの最初の行を記録するようにポイントするネットワークアプライアンス、保護されたサイトが外部サイトにリンクしている場合のリファラーヘッダーなど、いくつかの場所でリークする可能性があります。
一般的な推奨事項:車輪を発明しようとしないでください。 OWASPには REST Security Cheat Sheet というページと、以前リンクしたページがあります。 Angularアプローチ(各XHRリクエストでCookieからヘッダーにトークンをコピーする)アプローチに従うことができます。また、通常の非ajaxフォームでは、必ずPOSTおよび静的サーバーフォームのCSRF保護で通常行われる隠しフィールド。