38

APIURLがユーザー向けURLと同じであるサイトをDjangoで作成しようとしています。しかし、POSTリクエストとCSRF保護を使用するページで問題が発生しています。たとえば、ページ/ foo / addがある場合、次の2つの方法でPOSTリクエストを送信できるようにします。

  1. フォームを送信するエンドユーザー(セッションCookieを使用して認証)として。これにはCSRF保護が必要です。
  2. APIクライアントとして(HTTPリクエストヘッダーを使用して認証されます)。CSRF保護が有効になっている場合、これは失敗します。

@csrf_exemptなど、CSRFを無効にするさまざまな方法を見つけましたが、これらはすべて、ビュー全体でCSRFを無効にします。よりきめ細かいレベルで有効/無効にする方法はありますか?それとも、CSRF保護を最初から独自に実装する必要がありますか?

4

4 に答える 4

32

DjangoのCSRF保護ドキュメントには、ソリューションを説明する「ビューには1つのパスの保護が必要」というタイトルのセクションがあります。ビュー全体で使用するという考え方ですが@csrf_exempt、APIクライアントヘッダーが存在しないか無効な場合は、。で注釈が付けられた関数を呼び出します@csrf_protect

于 2012-07-07T11:33:30.503 に答える
0

私の場合、いくつかのビューに JWT 認証と csrf_token を使用しています。そして、私が気付いてcsrf_exemptいないいくつかの理由で、デコレータとして設定したとき、またはビュー名をURLパターンでラップしたときに機能しません。

だからここに私がやったことがあります。クラスinitialize_requestで利用可能なものをオーバーライドしました。APIView

class ClasssName(views.APIView):
    def initialize_request(self, request, *args, **kwargs):
        setattr(request, 'csrf_processing_done', True) 
        return super().initialize_request(request, *args, **kwargs)
于 2021-12-18T01:47:00.393 に答える