Ich versuche, das ganze Problem mit CSRF und geeignete Möglichkeiten zu verstehen, um es zu verhindern. (Ressourcen, die ich gelesen habe, verstehe und mit denen ich einverstanden bin: OWASP CSRF Prevention Cheat Sheet , Fragen zu CSRF .)
Soweit ich weiß, wird die Sicherheitsanfälligkeit in Bezug auf CSRF durch die Annahme verursacht, dass (aus Sicht des Webservers) ein gültiges Sitzungscookie in einer eingehenden HTTP-Anforderung die Wünsche eines authentifizierten Benutzers widerspiegelt. Alle Cookies für die Ursprungsdomäne werden jedoch vom Browser auf magische Weise an die Anforderung angehängt, sodass der Server aus dem Vorhandensein eines gültigen Sitzungscookies in einer Anforderung tatsächlich schließen kann, dass die Anforderung von einem Browser stammt, der über eine authentifizierte Sitzung verfügt. es kann nichts weiter über den Code annehmenin diesem Browser ausgeführt werden oder ob es wirklich Benutzerwünsche widerspiegelt. Um dies zu verhindern, müssen Sie zusätzliche Authentifizierungsinformationen (das "CSRF-Token") in die Anforderung aufnehmen, die auf andere Weise als durch die automatische Cookie-Behandlung des Browsers übertragen werden. Das Sitzungscookie authentifiziert also den Benutzer / Browser und das CSRF-Token authentifiziert den im Browser ausgeführten Code.
Kurz gesagt, wenn Sie ein Sitzungscookie verwenden, um Benutzer Ihrer Webanwendung zu authentifizieren, sollten Sie jeder Antwort ein CSRF-Token hinzufügen und in jeder (mutierenden) Anforderung ein passendes CSRF-Token benötigen. Das CSRF-Token führt dann einen Roundtrip vom Server zum Browser zurück zum Server durch und beweist dem Server, dass die Seite, auf der die Anforderung gestellt wird, von diesem Server genehmigt (sogar generiert) wurde.
Weiter zu meiner Frage, die sich auf die spezifische Transportmethode bezieht, die für dieses CSRF-Token auf dieser Rundreise verwendet wird.
Es scheint üblich zu sein (zB in AngularJS , Django , Rails ), das CSRF-Token als Cookie (dh in einem Set-Cookie-Header) vom Server an den Client zu senden und dann Javascript im Client aus dem Cookie zu entfernen und anzuhängen als separater XSRF-TOKEN-Header zum Zurücksenden an den Server.
(Eine alternative Methode ist die von z Express , bei der das vom Server generierte CSRF-Token über eine serverseitige Vorlagenerweiterung in den Antworttext aufgenommen wird und direkt an den Code / das Markup angehängt wird, der es an den Server zurückgibt, z Dieses Beispiel ist eine Web 1.0-ähnliche Methode, würde sich aber gut auf einen JS-lastigeren Client verallgemeinern lassen.)
Warum ist es so üblich, Set-Cookie als Downstream-Transport für das CSRF-Token zu verwenden / warum ist dies eine gute Idee? Ich stelle mir vor, die Autoren all dieser Frameworks haben ihre Optionen sorgfältig geprüft und das nicht falsch verstanden. Auf den ersten Blick erscheint es jedoch dumm, Cookies zu verwenden, um das zu umgehen, was im Wesentlichen eine Designbeschränkung für Cookies darstellt. Wenn Sie Cookies als Hin- und Rücktransport verwenden (Set-Cookie: Header Downstream für den Server, um dem Browser das CSRF-Token mitzuteilen, und Cookie: Header Upstream für den Browser, um es an den Server zurückzugeben), würden Sie die Sicherheitsanfälligkeit wieder einführen versuchen zu beheben.
Mir ist klar, dass die oben genannten Frameworks keine Cookies für die gesamte Hin- und Rückfahrt für das CSRF-Token verwenden. Sie verwenden Set-Cookie Downstream, dann etwas anderes (z. B. einen X-CSRF-Token-Header) Upstream, und dies schließt die Sicherheitsanfälligkeit aus. Aber selbst die Verwendung von Set-Cookie als nachgeschalteter Transport ist möglicherweise irreführend und gefährlich. Der Browser hängt nun das CSRF-Token an jede Anforderung an, einschließlich echter böswilliger XSRF-Anforderungen. Im besten Fall ist die Anfrage dadurch größer als nötig, und im schlimmsten Fall könnte ein gut gemeinter, aber fehlgeleiteter Teil des Servercodes tatsächlich versuchen, sie zu verwenden, was wirklich schlecht wäre. Da der tatsächlich beabsichtigte Empfänger des CSRF-Tokens clientseitiges Javascript ist, bedeutet dies, dass dieses Cookie nicht nur mit http geschützt werden kann.