11

データを取得するためにサーバーと通信する ios アプリを構築しています。

通常のアプリの場合は、フォームを介して csrf トークンを送信できます (すべて同じドメインからなので)。しかし、iOSアプリの場合、 csrf token を設定できるとは思いません。

そのため、ios アプリからサーバーにリクエストを送信すると、csrf に関するエラーが発生します。それで、これに対する解決策は何ですか?このcsrf機能または他のより良い方法を無効にしますか? これは私の最初の iOS アプリなので、より良い方法を教えてください。

4

1 に答える 1

13

@csrf_exemptiOS アプリがアクセスしている URL (「API エンドポイント」) については、対応するビュー関数で指定して csrf 保護を無効にする必要があります。

詳細はこちら - https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

また、セッション認証などの他の認証方法を使用してこれらの URL を保護します。

認証のために、django rest フレームワークと django Tastypie が行ったことを簡単に参照できます。どちらも SessionAuthentication クラスを使用して認証を処理し、iOS アプリが接続できる公開 URL (API エンドポイント) を保護します。

参考文献:-

Django Tastypie には認証クラスもありますが、これを認証と混同しないでください。また、APIKey 認証クラスもあり、django の URL を他のサードパーティの開発者に公開したい場合に役立ちます。サードパーティの開発者は、独自のアプリを構築して、django の URL と通信してデータにアクセスします (「facebook API」と考えてください)。 . 各サードパーティの開発者には、本質的に一意の API を提供できます。APIKeyAuthorization クラスと各サードパーティのアプリに提供される一意の API キーがあるため、「承認された」アプリのみが Django URL を使用できることを確認できます。これは、「Google+」や「Facebook」などのさまざまな大きなプラットフォームがどのように機能するかの本質です。

django の csrf の仕組みの詳細

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

CSRF 保護は、次のことに基づいています。

他のサイトがアクセスできない、ランダムな値 (いわゆるセッション独立ナンス) に設定された CSRF Coo​​kie。

この Cookie は CsrfViewMiddleware によって設定されます。これは永続的であることを意図していますが、有効期限が切れない Cookie を設定する方法がないため、django.middleware.csrf.get_token() (CSRF トークンを取得するために内部で使用される関数) を呼び出したすべての応答と共に送信されます。 .

すべての送信 POST フォームに存在する「csrfmiddlewaretoken」という名前の非表示のフォーム フィールド。このフィールドの値は、CSRF Coo​​kie の値です。

この部分は template タグによって行われます。

HTTP GET、HEAD、OPTIONS、または TRACE を使用していないすべての着信要求について、CSRF Coo​​kie が存在し、「csrfmiddlewaretoken」フィールドが存在し、正しい必要があります。そうでない場合、ユーザーは 403 エラーを受け取ります。

このチェックは CsrfViewMiddleware によって行われます。

さらに、HTTPS リクエストの場合、CsrfViewMiddleware によって厳密なリファラー チェックが行われます。これは、HTTP 'Set-Cookie' ヘッダーが (残念ながら) 通信しているクライアントによって受け入れられるため、セッションに依存しないナンスを使用するときに HTTPS で発生する可能性のある中間者攻撃に対処するために必要です。 HTTPS の下のサイト。(Referer ヘッダーの存在は HTTP では十分に信頼できないため、HTTP 要求に対しては Referer チェックは行われません。)

これにより、Web サイトから作成されたフォームのみを使用して POST データを戻すことができます。

于 2013-05-04T06:34:04.457 に答える