Frage

Die django csrf Middleware kann nicht deaktiviert werden. Ich habe es von meiner Middleware von meinem Projekt kommentiert, aber mein Logins aufgrund fehlender CSRF Fragen scheitern. Ich arbeite aus dem Django Stamm. Wie kann CSRF Probleme verursachen, wenn es nicht in Middleware aktiviert ist?

Ich habe es zu deaktivieren, weil es viele POST-Anfragen auf meiner Seite sind, die CSRF nur bricht. Jedes Feedback, wie ich kann, vollständig zu deaktivieren CSRF in einem django Stamm Projekt?

Der „neue‘ CSRF Rahmen von Stamm Djangos wird auch eine externe Website, die verwendeten kommt und eine POST an einer URL tut ich ihnen gebe (dies ist Teil einer RESTful API). Ich nicht deaktivieren kann die CSRF Rahmen, wie ich vorhin gesagt, wie kann ich dieses Problem beheben?

War es hilfreich?

Lösung

Siehe Antworten unten dies für eine bessere Lösung. Da ich dies schrieb, hat sich viel verändert. Inzwischen gibt es bessere Möglichkeiten, um CSRF zu deaktivieren.

Ich fühle deinen Schmerz. Es ist nicht akzeptabel für einen Rahmen so grundlegende Funktionalität zu ändern. Auch wenn ich von jetzt an mit diesem starten möchten, habe ich Legacy-Websites auf der gleichen Maschine eine Kopie von django teilen. Änderungen wie diese sollten Hauptversionsnummer Revisionen erforderlich. 1.x -> 2.x.

Wie auch immer, um es zu beheben ich es einfach auf Kommentar und hat die Aktualisierung Django so oft gestoppt.

Datei: django / Middleware / csrf.py Um die Linie 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.")

Andere Tipps

Ja, Django csrf Rahmen deaktiviert werden.

manuell Um eine Ansicht Funktion ausschließen, indem jede CSRF-Middleware behandelt werden, können Sie den csrf_exempt Dekorateur verwenden, in dem django.views.decorators.csrf Modul gefunden. Zum Beispiel: ( doc )

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

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

Sie können dies in Middleware deaktivieren.

In Ihrem settings.py eine Linie zu MIDDLEWARE_CLASSES hinzufügen:

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

Erstellen Sie eine disable.py in myapp mit den folgenden

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

Im Grunde genommen, wenn Sie die _dont_enforce_csrf_checks in Ihrer Anfrage festlegen, sollten Sie in Ordnung sein.

In der Regel sollten Sie nicht CSRF-Schutz werden deaktivieren, da dabei Sicherheitslücken öffnen. Wenn Sie darauf bestehen, obwohl ...

Eine neue Art und Weise CSRF Schutz tut gerade vor kurzem im Stamm gelandet. Ist Ihre Website durch Zufall noch konfiguriert es die alte Art und Weise zu tun? Hier sind die Dokumentation für den neuen Weg ™ und hier sind die < a href = "http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#legacy-method" rel = "noreferrer"> docs für The Old Way ™ .

Ich habe einfach versucht, die Verweise auf csrf Middleware-Klassen von meinem settings.py entfernen, es funktionierte. Nicht sicher, ob dies akzeptabel ist. Irgendwelche Kommentare? Im Folgenden zwei Zeilen wurden entfernt -

      'django.middleware.csrf.CsrfViewMiddleware',
      'django.middleware.csrf.CsrfResponseMiddleware',

meine django Version ist 1.11. die Middleware sollte wie folgt sein:

from django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top