webentwicklung-frage-antwort-db.com.de

Das Django CSRF-Framework kann nicht deaktiviert werden und bricht meine Website

Die Django csrf-Middleware kann nicht deaktiviert werden. Ich habe es in meiner Middleware zu meinem Projekt kommentiert, aber meine Anmeldungen schlagen fehl, weil CSRF-Probleme fehlen. Ich arbeite vom Django-Kofferraum aus. Wie kann CSRF Probleme verursachen, wenn es in der Middleware nicht aktiviert ist?

Ich muss es deaktivieren, da es auf meiner Site viele POST - Anforderungen gibt, die CSRF gerade bricht. Irgendein Feedback, wie ich CSRF in einem Django-Stammprojekt vollständig deaktivieren kann?

Das "neue" CSRF-Framework von Djangos Rumpf bricht auch eine externe Site, die gerade kommt und eine POST unter einer URL macht, die ich ihnen gebe (dies ist Teil einer erholsamen API.), Die ich nicht deaktivieren kann Wie kann ich das CSRF-Framework wie gesagt beheben?

55
MikeN

Siehe die Antworten unten für eine bessere Lösung. Seit ich das geschrieben habe, hat sich viel verändert. Es gibt jetzt bessere Möglichkeiten, CSRF zu deaktivieren.

Ich fühle deinen Schmerz. Es ist nicht akzeptabel, dass ein Framework eine solche grundlegende Funktionalität ändert. Selbst wenn ich von jetzt an damit arbeiten möchte, habe ich auf demselben Rechner ältere Websites, die eine Kopie von Django freigeben. Änderungen wie diese sollten größere Versionsnummernrevisionen erfordern. 1.x -> 2.x. 

Um das Problem zu beheben, habe ich es nur kommentiert und Django so oft nicht mehr aktualisiert.

Datei: Django/Middleware/csrf.py Um Zeile 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

Ja, das Django-CSRF-Framework kann deaktiviert werden.

Um eine View-Funktion manuell von der Verarbeitung durch eine CSRF-Middleware auszuschließen, können Sie den Dekorator csrf_exempt im Modul Django.views.decorators.csrf verwenden. Zum Beispiel: ( siehe doc )

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

..und entfernen Sie dann {% csrf_token %} innerhalb der Formulare aus Ihrer Vorlage oder lassen Sie andere Dinge unverändert, wenn Sie sie nicht in Ihre Formulare aufgenommen haben.

125
Adriot

Sie können dies in der Middleware deaktivieren.

Fügen Sie in Ihren settings.py eine Zeile zu MIDDLEWARE_CLASSES hinzu:

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

Erstellen Sie in myapp ein disable.py mit den folgenden Angaben

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

Wenn Sie in Ihrer Anfrage die _dont_enforce_csrf_checks setzen, sollten Sie in Ordnung sein.

82
shreddd

Im Allgemeinen sollten Sie den CSRF-Schutz nicht deaktivieren, da dadurch Sicherheitslücken entstehen. Wenn Sie darauf bestehen, aber…

Ein neuer Weg, CSRF-Schutz zu erreichen, ist erst vor kurzem im Kofferraum gelandet. Ist Ihre Site zufällig noch so konfiguriert, dass sie auf die alte Art und Weise funktioniert? Hier sind die Dokumente für The New Way ™ und hier sind die Dokumente für The Old Way ™ .

6
Hank Gay

Ich habe einfach versucht, die Verweise auf csrf-Middleware-Klassen aus meinen settings.py zu entfernen, es hat funktioniert. Nicht sicher, ob das akzeptabel ist. Kommentare? Unten wurden zwei Zeilen entfernt - 

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

meine Django-Version ist 1.11. Die Middleware sollte so sein:

from Django.utils.deprecation import MiddlewareMixin


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