wake-up-neo.com

CSRF-Token erforderlich bei Verwendung der statusfreien (= sitzungslosen) Authentifizierung?

Ist es notwendig, CSRF-Schutz zu verwenden, wenn die Anwendung auf zustandsloser Authentifizierung beruht (mit etwas wie HMAC)?

Beispiel:

  • Wir haben eine einseitige App (ansonsten müssen wir den Token an jeden Link anhängen: <a href="...?token=xyz">...</a>.

  • Der Benutzer authentifiziert sich mit POST /auth. Bei erfolgreicher Authentifizierung gibt der Server ein Token zurück.

  • Das Token wird über JavaScript in einer Variablen in der App für einzelne Seiten gespeichert.

  • Dieses Token wird verwendet, um auf eingeschränkte URLs wie /admin Zuzugreifen.

  • Das Token wird immer in HTTP-Headern übertragen.

  • Es gibt KEINE HTTP-Sitzung und KEINE Cookies.

Soweit ich weiß, sollte es (?!) keine Möglichkeit geben, Cross-Site-Angriffe auszuführen, da der Browser das Token nicht speichert und es daher nicht automatisch an den Server senden kann (das würde passieren, wenn Cookies verwendet werden). Session).

Vermisse ich etwas?

111
Benjamin M

Ich habe einige Informationen zu CSRF + gefunden, indem ich keine Cookies zur Authentifizierung verwendet habe:

  1. https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
    "Da Sie sich nicht auf Cookies verlassen, müssen Sie sich nicht vor standortübergreifenden Anfragen schützen."

  2. http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
    "Wenn wir Cookies verwenden, müssen Sie wirklich CSRF ausführen, um Cross-Site-Anfragen zu vermeiden. Das können wir bei der Verwendung von JWT vergessen, wie Sie sehen werden."
    (JWT = Json Web Token, eine Token-basierte Authentifizierung für zustandslose Apps)

  3. http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
    "Der einfachste Weg, eine Authentifizierung ohne das Risiko von CSRF-Schwachstellen durchzuführen, besteht darin, die Verwendung von Cookies zur Identifizierung des Benutzers zu vermeiden."

  4. http://sitr.us/2011/08/26/cookies-are-bad-for-you.html
    "Das größte Problem mit CSRF ist, dass Cookies absolut keinen Schutz gegen diese Art von Angriff bieten. Wenn Sie die Cookie-Authentifizierung verwenden, müssen Sie auch zusätzliche Maßnahmen zum Schutz vor CSRF ergreifen. Die grundlegendste Vorsichtsmaßnahme, die Sie treffen können, ist um sicherzustellen, dass Ihre Anwendung auf GET-Anforderungen keine Nebenwirkungen hat. "

Es gibt viele weitere Seiten, auf denen angegeben ist, dass Sie keinen CSRF-Schutz benötigen, wenn Sie keine Cookies zur Authentifizierung verwenden. Natürlich können Sie für alles andere immer noch Cookies verwenden, aber vermeiden Sie das Speichern von etwas wie session_id im Inneren.


Wenn Sie sich an den Benutzer erinnern müssen, gibt es zwei Möglichkeiten:

  1. localStorage: Ein Schlüsselwertspeicher im Browser. Die gespeicherten Daten stehen auch nach dem Schließen des Browserfensters zur Verfügung. Die Daten sind für andere Websites nicht zugänglich, da jede Site einen eigenen Speicher erhält.

  2. sessionStorage: Auch ein im Browser gespeicherter Datenspeicher. Der Unterschied ist: Die Daten werden gelöscht, wenn der Benutzer das Browserfenster schließt. Es ist aber trotzdem nützlich, wenn Ihre Webanwendung aus mehreren Seiten besteht. Sie können also Folgendes tun:

    • Benutzer meldet sich an, dann speichern Sie das Token in sessionStorage
    • Der Benutzer klickt auf einen Link, der eine neue Seite lädt (= a real Link, und kein Javascript-Inhalt ersetzen)
    • Sie können weiterhin über sessionStorage auf das Token zugreifen.
    • Zum Abmelden können Sie entweder das Token manuell aus sessionStorage löschen oder warten, bis der Benutzer das Browserfenster geschlossen hat, wodurch alle gespeicherten Daten gelöscht werden.

(für beide hier schauen: http://www.w3schools.com/html/html5_webstorage.asp )


Gibt es offizielle Standards für die Token-Authentifizierung?

[~ # ~] jwt [~ # ~] (Json Web Token): Ich denke, es ist immer noch ein Entwurf, aber es wird bereits von vielen Menschen und verwendet Das Konzept sieht einfach und sicher aus. (IETF: http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-25 )
Es gibt auch Bibliotheken für viele Frameworks. Googeln Sie einfach danach!

148
Benjamin M

TL; DR

Wenn ein JWT ohne Cookies verwendet wird, ist kein CSRF-Token erforderlich - ABER! Durch Speichern von JWT in session/localStorage legen Sie Ihre JWT und die Identität des Benutzers offen, wenn Ihre Site eine XSS-Sicherheitsanfälligkeit aufweist (ziemlich häufig). Es ist besser, dem JWT einen csrfToken -Schlüssel hinzuzufügen und das JWT in einem Cookie mit den Attributen secure und http-only Zu speichern.

Lesen Sie diesen Artikel mit einer guten Beschreibung für weitere Informationen https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

Sie können diesen CSRF-Schutz zustandslos machen, indem Sie eine xsrfToken-JWT-Behauptung einfügen:

{ "iss": "http://galaxies.com", "exp": 1300819380, "scopes": ["Explorer", "solar-harvester", "seller"], "sub": "[email protected]", "xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e" }

Daher müssen Sie das csrfToken sowohl in localStorage/sessionStorage als auch in der JWT selbst (die in einem nur http-fähigen und sicheren Cookie gespeichert ist) speichern. Vergewissern Sie sich zum Schutz von csrf, dass das csrf-Token im JWT mit dem übergebenen csrf-token-Header übereinstimmt.

53
Scott Jungwirth