web-dev-qa-db-ja.com

Django CSRFフレームワークを無効にすることはできず、私のサイトを壊しています

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

私のサイトにはCSRFが壊れるだけのPOSTリクエストがたくさんあるので、それを無効にする必要があります。 DjangoトランクプロジェクトでCSRFを完全に無効にする方法についてのフィードバックはありますか?

Djangoのトランクからの「新しい」CSRFフレームワークは、外部サイトに侵入し、提供しているURLでPOSTを実行します(これはRESTful APIの一部です)。前に言ったようにCSRFフレームワークを無効にするには、どうすれば修正できますか?

56
MikeN

より良い解決策については、この下の回答を参照してください。これを書いてから、多くの点が変更されました。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.")
11
Aaron

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

CSRFミドルウェアによる処理からビュー関数を手動で除外するには、Django.views.decorators.csrfモジュールにあるcsrf_exemptデコレーターを使用できます。例:( docを参照

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

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

125
Adriot

ミドルウェアでこれを無効にすることができます。

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を設定した場合、問題はありません。

82
shreddd

一般に、CSRF保護を無効にするべきではありません。無効にすると、セキュリティホールが開くからです。主張すれば…

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

6
Hank Gay

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

      'Django.middleware.csrf.CsrfViewMiddleware',
      'Django.middleware.csrf.CsrfResponseMiddleware',
4
Yateen

my Djangoバージョンは1.11です。ミドルウェアは次のようになります。

from Django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)
1
blackholll