58

django csrf ミドルウェアを無効にすることはできません。プロジェクトのミドルウェアからコメントアウトしましたが、CSRF の問題が見つからないためにログインに失敗しています。私はDjangoトランクから作業しています。CSRF がミドルウェアで有効になっていない場合、どのように問題が発生する可能性がありますか?

私のサイトには CSRF が破損する POST リクエストがたくさんあるため、無効にする必要があります。django トランク プロジェクトで CSRF を完全に無効にする方法に関するフィードバックはありますか?

Djangoのトランクからの「新しい」CSRFフレームワークも、入ってくる外部サイトを壊し、私が提供しているURLでPOSTを実行しています(これは安らかなAPIの一部です。)CSRFフレームワークを無効にすることはできません。先ほども言いましたが、どうすれば治りますか?

4

6 に答える 6

127

はい、Django csrf フレームワークを無効にすることができます。

ビュー関数が CSRF ミドルウェアによって処理されないように手動で除外するには、django.views.decorators.csrf モジュールにある csrf_exempt デコレーターを使用できます。例: (ドキュメントを参照)

from django.views.decorators.csrf import csrf_exempt                                          
@csrf_exempt                                                                                  
def my_view:                                                                            
    return Httpresponse("hello world")

..そして{% csrf_token %}、テンプレートからフォーム内を削除するか、フォームに含まれていない場合は他のものを変更しないでください。

于 2010-07-08T07:48:48.920 に答える
82

これはミドルウェアで無効にできます。

settings.py で、MIDDLEWARE_CLASSES に次の行を追加します。

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

次のように myapp に disable.py を作成します。

class DisableCSRF(object):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)

基本的に、リクエストに _dont_enforce_csrf_checks を設定すれば問題ありません。

于 2011-01-08T00:44:10.810 に答える
11

より良い解決策については、以下の回答を参照してください。私がこれを書いたので、多くが変わりました。CSRFを無効にするより良い方法があります。

あなたの痛みが分かります。フレームワークがそのような基本的な機能を変更することは受け入れられません。これから使い始めたいと思っても、同じマシン上にdjangoのコピーを共有しているレガシーサイトがあります。このような変更には、メジャーバージョン番号の改訂が必要です。1.x->2.x。

とにかく、それを修正するために、私はそれをコメントアウトし、Djangoの更新を頻繁に停止しました。

ファイル:django / middleware / csrf.py 160行目あたり:

            # check incoming token
#            request_csrf_token = request.POST.get('csrfmiddlewaretoken', None)
#            if request_csrf_token != csrf_token:
#                if cookie_is_new:
#                    # probably a problem setting the CSRF cookie
#                    return reject("CSRF cookie not set.")
#                else:
#                    return reject("CSRF token missing or incorrect.")
于 2010-03-12T10:43:10.787 に答える
5

一般に、CSRF 保護を無効にしないでください。無効にするとセキュリティ ホールが開くからです。ただし、どうしても…</p>

つい最近、CSRF 保護を行う新しい方法がトランクに導入されました。あなたのサイトは、たまたま古い方法でそれを行うように構成されていますか? ここに The New Way™のドキュメントがあり、ここに The Old Way™のドキュメントがあります。

于 2009-10-30T16:45:51.873 に答える
4

私は単にcsrfミドルウェアクラスへの参照をsettings.pyから削除しようとしましたが、うまくいきました。これが許容できるかどうかわからない。コメントはありますか?以下の2行が削除されました-

      'django.middleware.csrf.CsrfViewMiddleware',
      'django.middleware.csrf.CsrfResponseMiddleware',
于 2010-11-13T11:23:32.870 に答える