Frage

Django kommt mit CSRF Schutz Middleware , die pro Sitzung generiert einen eindeutigen Token für die Verwendung in Formularen. Es scannt alle eingehenden POST Anfragen für die richtigen Token, und lehnt die Anforderung, wenn das Token fehlt oder ungültig ist.

Ich möchte AJAX für einige POST-Anfragen verwenden, aber die Anfragen nicht die CSRF-Token availabnle haben. Die Seiten haben keine <form> Elemente in einzuhaken und ich möchte lieber nicht das Markup eingefügt das Token als versteckter Wert schlammig werden. Ich meine, ein guter Weg, dies zu tun ist, genießt den Ausblick wie /get-csrf-token/ belichten des Benutzers Token zurück, auf Browser-Cross-Site-Scripting-Regeln unter Berufung vor feindlichen Seiten zu verhindern, dass es angefordert wird.

Ist das eine gute Idee? Gibt es bessere Möglichkeiten, um gegen CSRF-Attacken zu schützen, während noch AJAX-Anfragen erlaubt?

War es hilfreich?

Lösung

Wenn Sie wissen, dass Sie die CSRF-Token für AJAX-Anfragen müssen, können Sie einbetten es immer im HTML irgendwo; dann können Sie es durch Javascript finden, indem Sie den DOM überquert. Auf diese Weise werden Sie immer noch Zugriff auf das Token, aber Sie setzen Sie sie nicht über eine API.

Um es anders auszudrücken: tut es durch Vorlagen Djangos - nicht über den URL-Dispatcher. Es ist viel mehr auf diese Weise sichern.

Andere Tipps

UPDATE : Die unten war wahr und wahr sein sollte, wenn alle Browser und Plugins wurden ordnungsgemäß umgesetzt werden. Leider wissen wir jetzt, dass sie nicht sind, und dass bestimmte Kombinationen von Browser-Plugins und Umleitungen können es einem Angreifer ermöglichen beliebige Header auf einer Cross-Domain-Anfrage. Leider bedeutet dies, dass auch AJAX-Anforderungen mit dem "X-Requested-With: XMLHttpRequest" Header muss jetzt CSRF-geschützt sein. Als Ergebnis Django nicht mehr ausnimmt Ajax-Anfragen von CSRF-Schutz .

Original Antwort

Es ist erwähnenswert, dass Anfragen von CSRF AJAX Schutz nicht erforderlich ist, da Browser Cross-Site-AJAX-Anforderungen nicht zulassen. In der Tat, jetzt die Django CSRF-Middleware automatisch ausnimmt AJAX Anfragen von CSRF-Token-Scanning .

Dies ist nur gültig, wenn Sie tatsächlich die X-Requested-With-Header Server-Seite für den "XMLHttpRequest" Wert überprüft werden (was Django tut), und nur echte AJAX Anfragen von CSRF-Scanning auszunehmen.

Abbrechen, dass ich falsch war. (Siehe Kommentare). Sie können den Exploit verhindern, indem Sie Ihre JSON Gewährleistung der Spezifikation folgt: Immer sicherstellen, dass Sie ein Objekt zurückgeben wörtlichen als Objekt der obersten Ebene. (Ich kann nicht garantieren, dass es keine weiteren Exploits sein wird. Stellen Sie sich einen Browser-Zugriff auf den ausgefallenen Code in seiner window.onerror Ereignisse bereitstellt!)

Sie können nicht auf Cross-Site-Scripting-Regeln vertrauen AJAX Antworten privat zu halten. Zum Beispiel, wenn Sie die CSRF-Token als JSON, eine bösartige Website zurückkehren konnte Neudefinition der String oder Array-Konstruktor und fordern Sie die Ressource.

bigmattyh ist richtig: Sie müssen die Token irgendwo im Markup einbetten. Alternativ können Sie keine Beiträge ablehnen, dass haben eine referer, dass nicht Spiel. Auf diese Weise nur Menschen mit übereifrigem Software-Firewalls werden CSRF anfällig sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top