特に、私はDjango iOSアプリケーションをバックアップするRESTful APIを書いています。そして、私はPOST =リクエスト。
私の理解では、iOSが管理するCookieはアプリケーションによって共有されないため、セッションCookieは安全であり、他のアプリケーションはそれらに乗ることができません。これは本当ですか?その場合、すべてのAPI関数をCSRF免除としてマークできますか?
それはCSRFの目的ではありません。 CSRFは、サイトへのデータの直接投稿を防ぐことです。つまり、クライアントは承認済みのpathを使用して実際に投稿する必要があります。つまり、フォームページを表示し、記入し、データを送信する必要があります。
APIの目的は、一般的にallowサードパーティエンティティがサイト上のデータ(CSRFの「クロスサイト」)にアクセスして操作することであるため、APIはCSRFをほとんど排除します。ですから、はい、原則として、どのAPIビューもCSRFを免除されるべきだと思います。ただし、shouldは引き続きベストプラクティスに従い、OAuthなどの何らかの認証で実際に変更を加えるすべてのAPIエンドポイントを保護します。
CSRF攻撃は、特定のドメインへのすべてのリクエストとともに暗黙的に送信されるCookieに依存しています。 APIエンドポイントでCookieベースの認証が許可されていない場合は、うまくいくはずです。
Cookieベースの認証を使用する場合でも、 iOSアプリはCookieを共有しない であるため、Cookieは安全です。ただし、通常とは異なるユーザーエージェントヘッダーを要求してWebブラウザーを意図的にブロックしない限り、別の当事者がAPIを使用するブラウザーベースのアプリを作成できます。APIがCookieベースの認証をサポートし、サポートしない場合、そのアプリはCSRF攻撃に対して脆弱になりますCSRF保護を適用しません。
APIを使用してWebサイトをサポートしている場合にも適用されます。
この場合、他のサイトにリクエストを埋め込んで、認証されたユーザーのアカウントにドライブバイ効果を与えることを防ぐために、何らかの形式のCSRF保護が必要です。
ChromeはクロスオリジンPOSTデフォルトでリクエストを拒否するようです(他のブラウザはそれほど厳密ではないかもしれません) tには副作用があります。
現在受け入れられているこの回答(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でセッションベースの認証を使用している場合、これは悲惨で非常に現実的な可能性があります。
DRF documentation、 APIによると、サーバーは(毎回パスワードを尋ねるのではなく)認証されたセッションを使用している限り、CSRF攻撃に対して脆弱です。
解決策は
GET
、HEAD
、OPTIONS
などの「安全な」HTTP操作を使用して、サーバー側の状態を変更できないようにしてください。POST
、PUT
、PATCH
、DELETE
などの「安全でない」HTTP操作には、常に有効なCSRFトークンが必要であることを確認してください。