AJAX、CSRF、CORSの使い方
「自身のウェブサイトにおける潜在的なCSRF/XSRF脆弱性を詳しく調べてください。これらは最悪の種類の脆弱性です。攻撃者にとって非常に簡単に悪用できますが、ソフトウェア開発者にとっては、少なくとも一度被害に遭うまでは、それほど直感的に理解しやすいものではありません。」
Javascriptクライアント
Web APIとインターフェースするJavaScriptクライアントを構築する場合は、クライアントがウェブサイトの残りの部分で使用されているものと同じ認証ポリシーを使用できるかどうかを検討し、CSRFトークンまたはCORSヘッダーを使用する必要があるかどうかを判断する必要があります。
対話しているAPIと同じコンテキスト内で実行されるAJAXリクエストは、通常SessionAuthentication
を使用します。これにより、ユーザーがログインすると、実行されるAJAXリクエストは、ウェブサイトの残りの部分で使用されているものと同じセッションベースの認証を使用して認証できます。
通信しているAPIとは異なるサイトで実行されるAJAXリクエストは、通常、TokenAuthentication
などのセッションベースではない認証スキームを使用する必要があります。
CSRF保護
クロスサイトリクエストフォージェリ保護は、特定の種類の攻撃から保護するためのメカニズムであり、ユーザーがウェブサイトからログアウトしておらず、有効なセッションを保持し続けている場合に発生する可能性があります。このような状況では、悪意のあるサイトがログイン済みのセッションのコンテキスト内でターゲットサイトに対してアクションを実行できる可能性があります。
これらのタイプの攻撃から身を守るには、次の2つのことを行う必要があります。
GET
、HEAD
、OPTIONS
などの「安全な」HTTP操作を使用してサーバー側の状態を変更できないようにします。POST
、PUT
、PATCH
、DELETE
などの「安全でない」HTTP操作には、常に有効なCSRFトークンが必要であることを確認します。
SessionAuthentication
を使用している場合は、POST
、PUT
、PATCH
、またはDELETE
操作には有効なCSRFトークンを含める必要があります。
AJAXリクエストを行うには、Djangoのドキュメントで説明されているように、HTTPヘッダーにCSRFトークンを含める必要があります。
CORS
クロスオリジンリソース共有は、クライアントが異なるドメインでホストされているAPIと対話できるようにするためのメカニズムです。CORSは、サーバーがクロスドメインリクエストを許可するかどうか、およびいつ許可する必要があるかをブラウザが判断できるようにする特定のヘッダーセットを含める必要があることを要求することによって機能します。
REST frameworkでCORSを処理する最良の方法は、ミドルウェアに必要なレスポンスヘッダーを追加することです。これにより、ビューの動作を変更する必要なく、透過的にCORSがサポートされます。
Adam Johnsonは、REST framework APIで正しく動作することが知られているdjango-cors-headersパッケージを保守しています。