Cross-site request forgery (CSRF) Prävention
Cross-site request forgeries (CSRF) können durch SameSite
-Cookies und Anti-CSRF-Tokens geschützt werden.
Problem
CSRF sind eine Klasse von Angriffen, bei denen unautorisierte Befehle von einem vertrauenswürdigen Benutzer an eine Website übertragen werden. Da sie die Cookies des Benutzers (und damit die Sitzungsinformationen) erben, scheinen sie gültige Befehle zu sein. Ein CSRF-Angriff könnte so aussehen:
<!-- Attempt to delete a user's account -->
<img src="https://accounts.example.org/management/delete?confirm=true" />
Wenn ein Benutzer eine Seite mit dem obigen HTML besucht, wird der Browser versuchen, eine GET
-Anfrage an die Quell-URL zu stellen. Wenn der Benutzer eingeloggt ist, wird der Browser seine Sitzungscookies bereitstellen, und der Versuch, das Konto zu löschen, wird erfolgreich sein.
Lösung
Es gibt eine Vielzahl von CSRF-Abschwächungsstrategien. Die gebräuchlichsten und transparentesten Methoden zur CSRF-Abschwächung sind SameSite
-Cookies und Anti-CSRF-Tokens.
Hinweis: Eine Cross-Site Scripting (XSS) Sicherheitslücke könnte jede CSRF-Abschwächungstechnik überwinden, die Sie implementieren. Stellen Sie sicher, dass Sie Ihre Website gegen beide Arten von Angriffen gleichzeitig absichern. XSS kann durch Funktionen wie Content Security Policy (CSP) geschützt werden.
SameSite
Cookies
SameSite
-Cookies erlauben es Ihnen, dem Browser anzugeben, dass er Cookies nur als Antwort auf Anfragen senden soll, die vom Ursprung der Cookies stammen, zum Beispiel. Dies führt dazu, dass der CSRF-Angriff fehlschlägt, da die bösartigen Befehle keine Cookies mitgesendet bekommen und sich daher nicht als Benutzer authentifizieren können. Die verfügbaren Werte sind:
Strict
-
Veranlasst den Browser, das Cookie nur als Antwort auf Anfragen zu senden, die vom Ursprung der Cookies stammen.
Lax
-
Ähnlich wie
Strict
, mit der Ausnahme, dass der Browser das Cookie auch sendet, wenn der Benutzer zur Ursprungsseite der Cookies navigiert (auch wenn er von einer anderen Seite kommt). None
-
Gibt an, dass Cookies sowohl bei Ursprungs- als auch bei websiteübergreifenden Anfragen gesendet werden.
Sie sollten das stärkste SameSite
-Niveau einstellen, das für Ihre Website noch funktioniert. Idealerweise sollten Sie None
niemals setzen, es sei denn, es ist wirklich nötig. Beachten Sie, dass Lax
der Standardwert ist, wenn der Header nicht angegeben wird.
Anti-CSRF-Tokens
Anti-CSRF-Tokens verhindern CSRF-Angriffe, indem sie das Vorhandensein eines geheimen, eindeutigen und unvorhersehbaren Tokens bei allen destruktiven Änderungen erforderlich machen. Diese Tokens können für eine gesamte Benutzersitzung gesetzt, regelmäßig rotiert oder für jede Anfrage einzigartig erstellt werden.
Es wird empfohlen, beide Strategien für Websites zu verwenden, die destruktive Änderungen wie das Löschen von Konten zulassen. Anti-CSRF-Tokens sind für andere Websites möglicherweise nicht erforderlich, obwohl es dennoch empfohlen wird, SameSite
auf einen Wert ungleich None
zu setzen, um die Privatsphäre des Benutzers zu schützen.
Die meisten Anwendungsframeworks haben eine eingebaute CSRF-Tokenisierung, um die Implementierung zu erleichtern. Stellen Sie sicher, dass Sie ein solches wählen, und versuchen Sie nicht, das Rad neu zu erfinden.
Beispiele
Implementieren eines Anti-CSRF-Tokens zusammen mit SameSite=Strict
Integrieren Sie ein geheimes Anti-CSRF-Token in ein Formular zur Konto-Löschung:
<input
type="hidden"
name="csrftoken"
value="1df93e1eafa42012f9a8aff062eeb1db0380b" />
Serverseitig setzen Sie ein Anti-CSRF-Cookie (JavaScript muss dies mit einem X-Header senden; es kann nicht cross-origin erfolgen):
Set-Cookie: CSRFTOKEN=1df93e1eafa42012f9a8aff062eeb1db0380b; Path=/; Secure; SameSite=Strict
Zurück auf der Clientseite verwenden Sie JavaScript, um das CSRF-Token als X-Header zu einer XMLHttpRequest hinzuzufügen:
const token = readCookie(CSRFTOKEN); // read the cookie
httpRequest.setRequestHeader("X-CSRF-Token", token); // add it as an X-CSRF-Token header