web-dev-qa-db-ja.com

CSRF攻撃はAPIに適用されますか?

特に、私はDjango iOSアプリケーションをバックアップするRESTful APIを書いています。そして、私はPOST =リクエスト。

私の理解では、iOSが管理するCookieはアプリケーションによって共有されないため、セッションCookieは安全であり、他のアプリケーションはそれらに乗ることができません。これは本当ですか?その場合、すべてのAPI関数をCSRF免除としてマークできますか?

49
Alex

それはCSRFの目的ではありません。 CSRFは、サイトへのデータの直接投稿を防ぐことです。つまり、クライアントは承認済みのpathを使用して実際に投稿する必要があります。つまり、フォームページを表示し、記入し、データを送信する必要があります。

APIの目的は、一般的にallowサードパーティエンティティがサイト上のデータ(CSRFの「クロスサイト」)にアクセスして操作することであるため、APIはCSRFをほとんど排除します。ですから、はい、原則として、どのAPIビューもCSRFを免除されるべきだと思います。ただし、shouldは引き続きベストプラクティスに従い、OAuthなどの何らかの認証で実際に変更を加えるすべてのAPIエンドポイントを保護します。

47
Chris Pratt

CSRF攻撃は、特定のドメインへのすべてのリクエストとともに暗黙的に送信されるCookieに依存しています。 APIエンドポイントでCookieベースの認証が許可されていない場合は、うまくいくはずです。

Cookieベースの認証を使用する場合でも、 iOSアプリはCookieを共有しない であるため、Cookieは安全です。ただし、通常とは異なるユーザーエージェントヘッダーを要求してWebブラウザーを意図的にブロックしない限り、別の当事者がAPIを使用するブラウザーベースのアプリを作成できます。APIがCookieベースの認証をサポートし、サポートしない場合、そのアプリはCSRF攻撃に対して脆弱になりますCSRF保護を適用しません。

45
Nick Retallack

APIを使用してWebサイトをサポートしている場合にも適用されます。

この場合、他のサイトにリクエストを埋め込んで、認証されたユーザーのアカウントにドライブバイ効果を与えることを防ぐために、何らかの形式のCSRF保護が必要です。

ChromeはクロスオリジンPOSTデフォルトでリクエストを拒否するようです(他のブラウザはそれほど厳密ではないかもしれません) tには副作用があります。

16
James

現在受け入れられているこの回答(2012年5月)は、セッションベースの認証を使用している場合を除き、ほとんど正しいです。 CORSの役割についても言及する価値があります。

単純なシナリオは、_foo.com_にアクセスし、WebサイトがJavascriptを実行して_api.com/users/123_へのAJAXベースのDELETEリクエストを行い、ユーザーに代わってユーザーを削除することです。これは、CORSが原因で常に可能であるとは限りません。ブラウザは、_foo.com_が明示的に_api.com_をホワイトリストに登録しない限り、_api.com_が_foo.com_に対してリクエストを行うことを防ぎます。これは、トークンベースの認証ではなく、APIにセッションベースの認証を使用していることも前提としています。セッションベースの認証では、_api.com_にログインしているユーザーは、ログインしたままリクエストを実行できます。トークンベースの認証がある場合(各リクエストはHTTP Authorizationヘッダーで作成する必要があります)認証トークンが含まれている場合)、安全です。セッションベース認証は、Cookieを介して暗黙的に認証トークンを送信します。

少し悪いシナリオは、信頼できるCORSドメインの1つが危険にさらされた場合です。たとえば、JavaScriptをサニタイズしないフォームがあり、ユーザーがそのフォームを介してサイトにJSを挿入することができます。セッションベースの認証を使用している場合、ページにアクセスする認証済みユーザーは、Javascriptの実行を確認し、APIリクエストを行います。 APIでセッションベースの認証を使用している場合、これは悲惨で非常に現実的な可能性があります。

9
aleemb

DRF documentation、 APIによると、サーバーは(毎回パスワードを尋ねるのではなく)認証されたセッションを使用している限り、CSRF攻撃に対して脆弱です。

解決策は

  1. GETHEADOPTIONSなどの「安全な」HTTP操作を使用して、サーバー側の状態を変更できないようにしてください。
  2. POSTPUTPATCHDELETEなどの「安全でない」HTTP操作には、常に有効なCSRFトークンが必要であることを確認してください。
2
nehemiah