it-swarm.com.de

Wie gehe ich mit dem CSRF-Schutz in einer Einzelseitenanwendung um?

Ich erstelle derzeit eine Einzelseitenanwendung mit einem JavaScript/HTML-Frontend. Das Front-End ruft eine WEB-API auf, die in .NET geschrieben wurde. Derzeit habe ich eine HTML-Seite, auf der ein Benutzer seine Anmeldeinformationen eingibt und auf Anmelden klickt. Eine AJAX - Anfrage wird dann an die WEB-API gesendet, die den Benutzer authentifiziert und ein Nur-HTTP-Cookie zurückgibt, das ein Json-Web-Token enthält. Der Browser sendet dieses Cookie dann bei jeder nachfolgenden Anfrage und die Controller validiert es.

Das oben Genannte funktioniert gut, es fehlt jedoch der CSRF-Schutz. Ich versuche herauszufinden, wie dies am besten umgesetzt werden kann. Aus meiner Forschung geht hervor, dass es einige Optionen gibt.

  1. Der Artikel unter https://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services schlägt vor, ein Token aus einem Cookie zu extrahieren und dieses dann einzureichen als Anforderungsheader. Dazu müsste ich das Nur-HTTP-Flag löschen, damit das JavaScript auf das Cookie zugreifen kann. Ich denke nicht, dass dies die beste Lösung ist, da sie die Sitzungsinformationen offenlegen könnte, wenn eine XSS-Sicherheitsanfälligkeit gefunden wird. Fehlt mir etwas?

  2. An anderer Stelle habe ich gelesen, wie man ein separates Cookie sendet, das das CSRF-Token enthält, und wie man mit JavaScript den Wert daraus herausholt. Senden Sie diesen Wert dann als benutzerdefinierten Header bei nachfolgenden AJAX -Anfragen und lassen Sie die WEB-API anhand dieses Headers validieren. Ich habe eine schnelle Proof-of-Concept-Anwendung dafür geschrieben und festgestellt, dass der Browser weiterhin sendet Das Cookie, das das CSRF-Token bei zukünftigen Anfragen zurückgesendet hat. Stellt dies ein Problem dar? Könnte eine Seite mit einem CSRF-Angriff dies irgendwie ausnutzen?

  3. Ähnlich wie oben, aber anstatt das CSRF-Token über ein Cookie zu liefern, liefern Sie es über einen benutzerdefinierten Header und lassen Sie es von JavaScript von dort lesen. Dies scheint am einfachsten zu sein, aber sehen Sie irgendwelche Nachteile bei diesem Ansatz?

Ist es auch sicher, weiterhin ein einzelnes CSRF-Token für die gesamte Sitzung eines Benutzers zu verwenden, oder sollte es bei jeder Anforderung aktualisiert werden?

7
Dave

Sie können die klassischen CSRF-Token-Strategien verwenden, die Verwendung in AJAX-basierten Anwendungen kann jedoch einige umständliche Anstrengungen erfordern. Für AJAX-spezifische Endpunkte stehen einfachere Optionen zur Verfügung:

  • Fügen Sie Anforderungen an Ihren Server einen zusätzlichen Header hinzu, z. B. "X-Requested-With: XMLHttpRequest" oder "X-Is-Local-XHR: true", und lassen Sie Ihren Server den Header für authentifizierte Anforderungen benötigen. Benutzer mit alten Flash-Versionen sind möglicherweise anfällig (obwohl alte Flash-Versionen auch viel schlimmere Sicherheitslücken aufweisen, entscheiden Sie also, ob dies für Sie wichtig ist). Siehe https://stackoverflow.com/questions/17478731/whats-the-point-of-the-x-requested-with-header

  • Stellen Sie sicher, dass entweder der Origin- oder der Referer-Header festgelegt ist und mit der Domäne im Host-Header übereinstimmt. Der Origin-Header wird für alle POST -Anfragen von Chrome und Firefox, aber ältere Browser enthalten ihn möglicherweise nicht) gesendet. Der Referer-Header wird von einigen Benutzern aus Datenschutzgründen deaktiviert Das Vorhandensein von einem mit einem gültigen Wert reicht aus, um die Anforderung zu überprüfen.

1
Macil

Dies ist ein altes Thema und es gibt viele verstreute Diskussionen (einschließlich hier auf Security.SE). Anstelle des allgemeinen Vorschlags, ein auf Cookies und Post-Back basierendes CSRF-Schutzschema zu emulieren, schlage ich jedoch vor, dass Sie Cookies ganz weglassen.

Behandeln Sie Ihre einseitige App wie eine echte App und lassen Sie sie mit den Standardmethoden bei Web-APIs authentifizieren. Beispielsweise können Sie OAuth Token und sitzungslose Anforderungen) verwenden. (Wenn OAuth ist zu schwierig einzurichten, kann ein benutzerdefiniertes Token-Schema verwendet werden.)

Dies löst auch Probleme mit CORS.

1
billc.cn