2015-08-26 6 views
9

Meine Website hat eine AJAX POST-Ansicht, die von jeder Seite der App aus aufgerufen werden kann (Ereignisverfolgung). Diese Ansicht ist durch CSRF geschützt. In einigen Fällen ist das CSRF-Cookie nicht gesetzt und der POST-Aufruf schlägt fehl.Django: CSRF-Token für alle Antworten erzwingen

Statt manuell alle Ansichten mit @ensure_csrf_cookie Dekoration, Ich denke an Schreib habe ich eine Middleware, die Django erzwingt auf allen Antworten die CSRF-Cookie zu setzen. Ist dieser Ansatz richtig? Erzeugt es eine Sicherheitslücke, die mir nicht bekannt ist?

Update: hier ist der Middleware-Code:

from django.middleware.csrf import get_token 

class ForceCsrfCookieMiddleware(object): 
    def process_request(self, request): 
     get_token(request) 
+1

Fehler Sicherheit? Ich denke nicht. Weil Sie nur die Funktionalität von 'secure_csrf_cookie' in einer Middleware implementieren. Lesen Sie den Quellcode dieses Dekorators. – xyres

Antwort

1

Nein, es ist kein Problem, solange Sie nicht die csrf Token in einer Form zu machen, die Beiträge auf eine externe Seite (aber die wäre sowieso ein Problem, egal wo du es implementierst). Sie können es auf einer Middleware oder einigen Ansichten oder auf allen Ansichten festlegen, es spielt keine Rolle.

Der CSRF-Schutz wird nur vorgenommen, um sicherzustellen, dass die Anfrage von Ihrer Site kommt. Unabhängig davon, wie oft Sie den Cookie gesetzt haben, bedeutet dies, dass die Anfrage tatsächlich von Ihrer Site kommt, wenn die Anfrage das korrekte CSRF-Token enthält, da nur Ihre Site auf Ihre Cookies zugreifen kann. (Natürlich gilt dies nur, wenn Sie nicht undicht sind die CSRF-Token an Dritte, zum Beispiel indem sie sie an andere Standorte zu senden)

In wenigen Worten, dies ist, wie es funktioniert:

  1. Der Server setzt ein Cookie mit einem zufälligen Wert in der Antwort
  2. Ihre Website liest diesen Wert und sendet es an den Server beim Posten von Daten
  3. Da Cookies nur von der gleichen Domäne, die sie gesetzt hat, zugegriffen werden kann, gibt es keine Möglichkeit für eine andere Website um diesen Cookie zu lesen. Wenn Sie also eine Anfrage mit dem richtigen csrf-Token erhalten, können Sie sicher sein, dass diese Anfrage von Ihrer Site kommt.

Für eine sehr gute Erklärung von CSRF, haben einen Blick auf diesen Artikel: http://www.gnucitizen.org/blog/csrf-demystified/