Ist es erforderlich, CSRF-Schutz zu verwenden, wenn die Anwendung auf einer zustandslosen Authentifizierung basiert (unter Verwendung von HMAC)?
Beispiel:
Wir haben eine App für eine einzelne Seite (andernfalls müssen wir das 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 Einzelseiten-App gespeichert.
Dieses Token wird verwendet, um auf eingeschränkte URLs wie zuzugreifen
/admin
.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 zu verwenden, da der Browser das Token nicht speichert und es daher nicht automatisch an den Server senden kann (dies würde bei der Verwendung von Cookies / passieren). Session).
Vermisse ich etwas
Antworten:
Ich habe einige Informationen zu CSRF + gefunden, bei denen keine Cookies zur Authentifizierung verwendet wurden:
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."
http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
"Wenn wir Cookies verwenden, müssen Sie wirklich CSRF durchführen, um Cross-Site-Anfragen zu vermeiden. Das können wir Vergessen Sie bei der Verwendung von JWT, wie Sie sehen werden. "
(JWT = Json Web Token, eine Token-basierte Authentifizierung für zustandslose Apps)
http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
"Der einfachste Weg, eine Authentifizierung durchzuführen, ohne CSRF-Schwachstellen zu riskieren, besteht darin, die Verwendung von Cookies zur Identifizierung des Benutzers einfach zu vermeiden ""
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 Sie müssen auch zusätzliche Maßnahmen zum Schutz vor CSRF ergreifen. Die grundlegendste Vorsichtsmaßnahme, die Sie treffen können, besteht darin, sicherzustellen, dass Ihre Anwendung als Reaktion auf GET-Anforderungen niemals Nebenwirkungen aufweist. "
Es gibt viele weitere Seiten, auf denen angegeben wird, dass Sie keinen CSRF-Schutz benötigen, wenn Sie keine Cookies zur Authentifizierung verwenden. Natürlich können Sie weiterhin Cookies für alles andere verwenden, aber vermeiden Sie es, etwas darin zu speichern
session_id
.Wenn Sie sich an den Benutzer erinnern müssen, gibt es zwei Möglichkeiten:
localStorage
: Ein Schlüsselwertspeicher im Browser. Die gespeicherten Daten sind auch dann verfügbar, wenn der Benutzer das Browserfenster schließt. Auf die Daten können andere Websites nicht zugreifen, da jede Website einen eigenen Speicher erhält.sessionStorage
: Auch ein im Browser vorhandener Datenspeicher. Der Unterschied ist: Die Daten werden gelöscht, wenn der Benutzer das Browserfenster schließt. Es ist jedoch weiterhin nützlich, wenn Ihre Webanwendung aus mehreren Seiten besteht. Sie können also Folgendes tun:sessionStorage
sessionStorage
sessionStorage
oder warten, bis der Benutzer das Browserfenster schließt, in dem alle gespeicherten Daten gelöscht werden.(für beide schauen Sie hier: http://www.w3schools.com/html/html5_webstorage.asp )
Gibt es offizielle Standards für die Tokenauthentifizierung?
JWT (Json Web Token): Ich denke, es ist immer noch ein Entwurf, aber er wird bereits von vielen Menschen verwendet und 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. Google einfach dafür!
quelle
http://.../someRestResource?method=POST
. Es handelt sich also im Grunde genommen um eineGET
Anforderung, die von der Serveranwendung jedoch alsPOST
Anforderung interpretiert wird , da sie so konfiguriert wurde, dass dermethod
Parameter anstelle des HTTP-Headers verwendet wird....
In Bezug auf die gängigen Webbrowser erzwingen sie die Same-Origin-Richtlinie und führen nurGET
Anforderungen an fremde Server aus. Es könnte jedoch möglich sein,POST
Anforderungen auszuführen , wenn der Webbrowser diese Webstandards (Fehler, Malware) nicht anwendet.Server Side App
: Es ist immer noch nicht möglich, einen Anfragetext zu senden, da die gängigen Browser dies nicht zulassen. Wenn die Server-App dies zulässtmethod=POST
, kann möglicherweise auchbody={someJson}
der Standardanforderungstext überschrieben werden. Das ist wirklich schlechtes API-Design und extrem riskant. Wenn Ihre Server-App dies zulässthttp://...?method=POST&body={someJson}
, sollten Sie jedoch wirklich überlegen, was Sie dort getan haben und warum und ob dies überhaupt erforderlich ist. (Ich würde sagen, in 99.9999% der Fälle ist es nicht notwendig). Außerdem können Browser auf diese Weise nur wenige Kilobyte senden.TL; DR
Wenn ein JWT ohne Cookies verwendet wird, ist kein CSRF-Token erforderlich - ABER! Indem Sie JWT in session / localStorage speichern, legen Sie Ihre JWT- und Benutzeridentität offen, wenn Ihre Site eine XSS-Sicherheitsanfälligkeit aufweist (ziemlich häufig). Es ist besser , einen hinzuzufügen
csrfToken
Schlüssel zum JWT und speichern Sie die JWT in einem Cookie mitsecure
undhttp-only
Attribute gesetzt.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 müssen das csrfToken also sowohl in localStorage / sessionStorage als auch im JWT selbst speichern (das in einem Nur-http-Cookie und einem sicheren Cookie gespeichert ist). Stellen Sie dann zum Schutz der CSRF sicher, dass das CSRF-Token im JWT mit dem übermittelten CSRF-Token-Header übereinstimmt.
quelle