it-swarm.com.de

CSRF-Schutz und Single Page Apps

Ich bin gerade dabei, eine Thick Client-Web-App mit Angular.js (Single-Page-App) zu schreiben, und habe mich gefragt, welche Methoden zum Sichern der App mit einem CSRF-Token am besten geeignet sind.

Sollte ich beim ersten Laden der App ein CSRF-Token senden und dieses Token dann bei jeder Anforderung erneut verwenden? Sollte ich einen Mechanismus zum Aktualisieren des Tokens haben? Gibt es andere Schutzmaßnahmen als ein CSRF-Token, die für eine App mit nur einer Seite sinnvoller wären?

31
Olivier Lalonde

Nun, hier ist, wie ich CSRF implementiert habe:

Setzt bei der ersten Anforderung ein CSRF-Token als Cookie. Jede nachfolgende AJAX -Anforderung enthält das CSRF-Token als X-CSRF-Token HTTP-Header.

Django hat einige nette Dokumentationen, wie man das mit jQuery sauber macht: https://docs.djangoproject.com/de/dev/ref/contrib/csrf/

Bearbeiten: Ein alternativer Ansatz, der Anforderungen auf die Whitelist setzt, die den Header X-Requested-With Enthalten. Es scheint, dass dies ist, was Rails macht . Aber wie @damio unten hervorhob, ist das X-Requested-With ein Sicherheitsrisiko, Django und Rails haben zurückgesetzt, um es nicht zu verwenden und einen Token zu erzwingen.

18
Olivier Lalonde

Du hast Glück! Vor ungefähr zwei Wochen wurde mir dieselbe Frage gestellt, und nach einigem Kopfkratzen kam ich auf Folgendes. Bitte denken Sie daran, dass dies nicht gut begutachtet wird, also werden wir sehen, wie die Kommentare und Abstimmungen verlaufen. Persönlich denke ich, dass es eine gute Technik ist.

1. Erste Anfrage

Wenn Sie die erste Anforderung zum Laden Ihrer Anwendung erhalten haben, generieren Sie eine sichere zufällige Kennung, speichern Sie sie in einer Sitzungsvariablen auf dem Server und senden Sie sie an den Client. Ich würde es kurz vor </body> In die Seite einbetten.

<script>setToken('<% print SESSION[TOKEN] %>');</script>
</body>

Ihre setToken() würde den Tokenwert der Variablen zuweisen, in der Sie das Token behalten würden.

2. Nachfolgende Anfragen

Bei jeder Anforderung würden Sie dieses Token zur Liste der Parameter hinzufügen, z. B. token=TOKEN, Und der Serve würde es mit dem in der Sitzungsvariablen gespeicherten Token vergleichen.

. Aktualisieren des Tokens

Es ist nicht unbedingt erforderlich, aber es ist eine gute Idee, den Token von Zeit zu Zeit zu aktualisieren, z. B. 15 Minuten. Wenn Sie nach Ablauf des Tokens eine Anfrage erhalten (Sie haben die Ablaufzeit in der Sitzungsvariablen), antworten Sie normal (optimistisch), aber in der Antwort teilen Sie dem Client mit, dass das alte Token abgelaufen ist und die Verwendung des Tokens beginnen sollte ein neues.

Der Client reagiert darauf, indem er dem Server mitteilt, dass er das neue Token jetzt kennt. Sobald der Server diese Anforderung erhält, beginnt er mit der Verwendung des neuen Tokens und antwortet dem Client mit einer OK-Nachricht. Sobald der Client 200 OK Empfängt, bedeutet dies dass beide synchron sind und der Client das neue Token verwendet.

Hinweis : Ein Schlüsselelement im Prozess ist die Verwendung von HTTPS. Sie wollen nicht, dass ein Mann in der Mitte an dem Token schnüffelt. Andererseits könnte ein MitM die Cookies schnüffeln und die Sitzung trotzdem entführen.

16
Adi