2012-07-23 9 views
7

ein Anfänger in Cookies zu sein, CSRF und Django (1.4 verwenden), von dem, was ich ausmachen kann dies ist, wie es funktioniert, mir bitte korrigieren, wo ich schief gehen ...Funktioniert Djangos CSRF-Schutz?

Nachfolgend wo django.middleware gilt. csrf.CsrfViewMiddleware ist im Tupel MIDDLEWARE_CLASSES enthalten.

Wenn ein POST-Formular das csrf_token-Tag enthält und die betreffende Ansicht RequestContext an die Vorlage übergibt, bedeutet das Anfordern der Seite, dass Django ein ausgeblendetes Formularfeld enthält, das eine alphanumerische Zeichenfolge enthält. Django gibt auch einen Cookie mit dem Namen csrftoken an den Browser zurück und setzt den Wert auf die gleiche alphanumerische Zeichenfolge.

Beim Empfang der Formularübergabe prüft Django, ob der alphanumerische Zeichenfolgenwert aus dem ausgeblendeten Formularfeld übereinstimmt und der csrftoken-Cookie vom Browser empfangen wurde. Wenn sie nicht übereinstimmen, wird eine Antwort 403 ausgegeben.

Ein CSRF-Angriff kann in Form einer bösartigen Website mit einem Iframe auftreten. Der Iframe enthält ein POST-Formular und etwas JavaScript. Das Attribut action des Formulars verweist auf meine Django-Site. Das Formular wurde entwickelt, um etwas Unerfreuliches an meiner Site zu machen, und die JS übermittelt das Formular, wenn der Iframe geladen wird.

Der Browser enthält das csrftoken Cookie in der Kopfzeile der Formularübergabe. Das Formular enthält jedoch nicht das ausgeblendete Feld mit der übereinstimmenden alphanumerischen Zeichenfolge, sodass 403 zurückgegeben wird und der Angriff fehlschlägt. Wenn der Iframe JS versuchte, auf das Cookie zuzugreifen, um das korrekte Hiddden-Formularfeld zu erstellen, würde der Browser dies verhindern.

Ist das korrekt?

+1

Ich sehe nichts falsch. Vielleicht andere, aber im Allgemeinen hast du es verstanden. – Zashas

Antwort

0

Ich würde sagen, dass Sie richtig sind. Sie finden here meine eigene Formulierung davon.

Fassen wir zusammen:

  • Der CSRF-Token aus dem Code gesendet wird, was bedeutet, dass der Schadcode muss es wissen.
  • Das CSRF-Token wird in einem Cookie gespeichert und vom Browser gesendet.
  • Der Angreifer kann aufgrund der Richtlinie für denselben Ursprung nicht auf den Cookie zugreifen.
  • Der Server kann einfach verifizieren, dass der "sichere" Wert, der vom Cookie kommt, derselbe ist wie der, der vom Code kommt.
1

Ich denke, was Sie wollen, ist hier in der offiziellen Django Dokumentation beschrieben. https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

Link oben gebrochen war, als ich versuchte, aber für Version 1.7 das funktioniert: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

+1

Danke für den Link. Darin heißt es: "Dadurch wird sichergestellt, dass nur Formulare, die von Ihrer Website stammen, für POST-Daten verwendet werden können." aber es sagt nicht, wie es das gewährleistet. –

+0

Ich habe diesen Teil der Django-Codebasis in letzter Zeit nicht angeschaut, aber wenn ich von woanders weiß, wird UrlParse verwendet, um die Basis-URL zu erkennen. Wenn die Basis-URL nicht mit der Host-URL übereinstimmt, wird ein Fehler zurückgegeben oder automatisch fehlgeschlagen. (Es schlägt automatisch fehl, wenn Sie versuchen, eine Antwort auf ein anderes Schema wie foo: // zurückzugeben. – fundamol

Verwandte Themen