Warum ist es üblich, CSRF-Präventionstoken in Cookies zu setzen?


283

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.


Es ist eine großartige Frage, den richtigen Punkt zu treffen.
kta

Antworten:


262

Ein guter Grund, den Sie angesprochen haben, ist, dass das CSRF-Cookie nach dem Empfang in der gesamten Anwendung im Client-Skript zur Verwendung sowohl in regulären Formularen als auch in AJAX-POSTs verfügbar ist. Dies ist in einer JavaScript-lastigen Anwendung wie der von AngularJS verwendeten sinnvoll (für die Verwendung von AngularJS ist es nicht erforderlich, dass die Anwendung eine Einzelseiten-App ist. Daher ist es hilfreich, wenn der Status zwischen verschiedenen Seitenanforderungen mit dem CSRF-Wert fließen muss kann normalerweise nicht im Browser bestehen bleiben).

Betrachten Sie die folgenden Szenarien und Prozesse in einer typischen Anwendung für einige Vor- und Nachteile jedes von Ihnen beschriebenen Ansatzes. Diese basieren auf dem Synchronizer-Token-Muster .

Body Approach anfordern

  1. Benutzer meldet sich erfolgreich an.
  2. Server gibt Auth-Cookie aus.
  3. Der Benutzer klickt, um zu einem Formular zu navigieren.
  4. Wenn dies für diese Sitzung noch nicht generiert wurde, generiert der Server ein CSRF-Token, speichert es für die Benutzersitzung und gibt es in einem ausgeblendeten Feld aus.
  5. Benutzer sendet Formular.
  6. Der Server überprüft, ob das versteckte Feld mit dem gespeicherten Sitzungstoken übereinstimmt.

Vorteile:

  • Einfach zu implementieren.
  • Funktioniert mit AJAX.
  • Arbeitet mit Formularen.
  • Cookie kann eigentlich nur HTTP sein .

Nachteile:

  • Alle Formulare müssen das ausgeblendete Feld in HTML ausgeben.
  • Alle AJAX-POSTs müssen auch den Wert enthalten.
  • Die Seite muss im Voraus wissen, dass das CSRF-Token erforderlich ist, damit es in den Seiteninhalt aufgenommen werden kann, sodass alle Seiten irgendwo den Token-Wert enthalten müssen, was die Implementierung für eine große Site zeitaufwändig machen kann.

Benutzerdefinierter HTTP-Header (Downstream)

  1. Benutzer meldet sich erfolgreich an.
  2. Server gibt Auth-Cookie aus.
  3. Der Benutzer klickt, um zu einem Formular zu navigieren.
  4. Wenn die Seite im Browser geladen wird, wird eine AJAX-Anforderung zum Abrufen des CSRF-Tokens gestellt.
  5. Der Server generiert ein CSRF-Token (falls nicht bereits für die Sitzung generiert), speichert es für die Benutzersitzung und gibt es in einem Header aus.
  6. Der Benutzer sendet ein Formular (das Token wird über ein verstecktes Feld gesendet).
  7. Der Server überprüft, ob das versteckte Feld mit dem gespeicherten Sitzungstoken übereinstimmt.

Vorteile:

  • Funktioniert mit AJAX.
  • Cookie kann nur HTTP sein .

Nachteile:

  • Funktioniert nicht ohne eine AJAX-Anforderung zum Abrufen des Header-Werts.
  • Bei allen Formularen muss der Wert dynamisch zu HTML hinzugefügt werden.
  • Alle AJAX-POSTs müssen auch den Wert enthalten.
  • Die Seite muss zuerst eine AJAX-Anfrage stellen, um das CSRF-Token zu erhalten. Dies bedeutet jedes Mal eine zusätzliche Rundreise.
  • Könnte auch einfach das Token auf der Seite ausgegeben haben, die die zusätzliche Anfrage speichern würde.

Benutzerdefinierter HTTP-Header (Upstream)

  1. Benutzer meldet sich erfolgreich an.
  2. Server gibt Auth-Cookie aus.
  3. Der Benutzer klickt, um zu einem Formular zu navigieren.
  4. Wenn dies für diese Sitzung noch nicht generiert wurde, generiert der Server ein CSRF-Token, speichert es für die Benutzersitzung und gibt es irgendwo im Seiteninhalt aus.
  5. Der Benutzer sendet das Formular über AJAX (das Token wird über den Header gesendet).
  6. Der Server überprüft, ob der benutzerdefinierte Header mit dem gespeicherten Sitzungstoken übereinstimmt.

Vorteile:

  • Funktioniert mit AJAX.
  • Cookie kann nur HTTP sein .

Nachteile:

  • Funktioniert nicht mit Formularen.
  • Alle AJAX-POSTs müssen den Header enthalten.

Benutzerdefinierter HTTP-Header (Upstream & Downstream)

  1. Benutzer meldet sich erfolgreich an.
  2. Server gibt Auth-Cookie aus.
  3. Der Benutzer klickt, um zu einem Formular zu navigieren.
  4. Wenn die Seite im Browser geladen wird, wird eine AJAX-Anforderung zum Abrufen des CSRF-Tokens gestellt.
  5. Der Server generiert ein CSRF-Token (falls nicht bereits für die Sitzung generiert), speichert es für die Benutzersitzung und gibt es in einem Header aus.
  6. Der Benutzer sendet das Formular über AJAX (das Token wird über den Header gesendet).
  7. Der Server überprüft, ob der benutzerdefinierte Header mit dem gespeicherten Sitzungstoken übereinstimmt.

Vorteile:

  • Funktioniert mit AJAX.
  • Cookie kann nur HTTP sein .

Nachteile:

  • Funktioniert nicht mit Formularen.
  • Alle AJAX-POSTs müssen auch den Wert enthalten.
  • Die Seite muss zuerst eine AJAX-Anfrage stellen, um das CRSF-Token zu erhalten. Dies bedeutet jedes Mal eine zusätzliche Rundreise.

Set-Cookie

  1. Benutzer meldet sich erfolgreich an.
  2. Server gibt Auth-Cookie aus.
  3. Der Benutzer klickt, um zu einem Formular zu navigieren.
  4. Der Server generiert ein CSRF-Token, speichert es für die Benutzersitzung und gibt es an ein Cookie aus.
  5. Der Benutzer sendet das Formular über AJAX oder über das HTML-Formular.
  6. Der Server überprüft, ob der benutzerdefinierte Header (oder das ausgeblendete Formularfeld) mit dem gespeicherten Sitzungstoken übereinstimmt.
  7. Das Cookie ist im Browser zur Verwendung in zusätzlichen AJAX- und Formularanforderungen ohne zusätzliche Anforderungen an den Server zum Abrufen des CSRF-Tokens verfügbar.

Vorteile:

  • Einfach zu implementieren.
  • Funktioniert mit AJAX.
  • Arbeitet mit Formularen.
  • Erfordert nicht unbedingt eine AJAX-Anforderung, um den Cookie-Wert abzurufen. Jede HTTP-Anfrage kann sie abrufen und über JavaScript an alle Formulare / AJAX-Anfragen anhängen.
  • Sobald das CSRF-Token abgerufen wurde, da es in einem Cookie gespeichert ist, kann der Wert ohne zusätzliche Anforderungen wiederverwendet werden.

Nachteile:

  • Bei allen Formularen muss der Wert dynamisch zu HTML hinzugefügt werden.
  • Alle AJAX-POSTs müssen auch den Wert enthalten.
  • Das Cookie wird für jede Anforderung (dh alle GETs für Bilder, CSS, JS usw., die nicht am CSRF-Prozess beteiligt sind) gesendet, wodurch die Anforderungsgröße erhöht wird.
  • Cookie kann nicht nur HTTP sein .

Der Cookie-Ansatz ist also ziemlich dynamisch und bietet eine einfache Möglichkeit, den Cookie-Wert (jede HTTP-Anforderung) abzurufen und zu verwenden (JS kann den Wert automatisch zu jedem Formular hinzufügen und in AJAX-Anforderungen entweder als Header oder als Header verwenden Formularwert). Sobald das CSRF-Token für die Sitzung empfangen wurde, muss es nicht erneut generiert werden, da ein Angreifer, der einen CSRF-Exploit verwendet, keine Methode zum Abrufen dieses Tokens hat. Wenn ein böswilliger Benutzer versucht, das CSRF-Token des Benutzers mit einer der oben genannten Methoden zu lesen, wird dies durch die Richtlinie für denselben Ursprung verhindert . Wenn ein böswilliger Benutzer versucht, die CSRF-Tokenserverseite abzurufen (z. B. übercurl) dann wird dieses Token nicht demselben Benutzerkonto zugeordnet, in dem das Authentifizierungssitzungs-Cookie des Opfers in der Anforderung fehlt (es wäre das des Angreifers - daher wird es der Sitzung des Opfers nicht serverseitig zugeordnet).

Neben dem Synchronizer-Token-Muster gibt es auch das Double Submit-CookieCSRF-Präventionsmethode, bei der natürlich Cookies zum Speichern einer Art CSRF-Token verwendet werden. Dies ist einfacher zu implementieren, da für das CSRF-Token kein serverseitiger Status erforderlich ist. Das CSRF-Token könnte tatsächlich das Standardauthentifizierungs-Cookie sein, wenn diese Methode verwendet wird, und dieser Wert wird wie gewohnt mit der Anforderung über Cookies gesendet. Der Wert wird jedoch auch in einem ausgeblendeten Feld oder Header wiederholt, als das ein Angreifer nicht replizieren kann Sie können den Wert überhaupt nicht lesen. Es wird jedoch empfohlen, ein anderes Cookie als das Authentifizierungscookie zu wählen, damit das Authentifizierungscookie durch Markieren mit HttpOnly gesichert werden kann. Dies ist ein weiterer häufiger Grund, warum Sie CSRF-Prävention mithilfe einer Cookie-basierten Methode finden.


7
Ich bin nicht sicher, ob ich verstehe, wie "AJAX-Anforderung zum Abrufen des CSRF-Tokens" (Schritt 4 in beiden Abschnitten "Benutzerdefinierter Header: Downstream") sicher ausgeführt werden kann. Da es sich um eine separate Anforderung handelt, weiß der Server nicht, von wem er stammt. Woher weiß es, dass es sicher ist, das CSRF-Token preiszugeben? Es scheint mir, wenn Sie das Token nicht aus dem anfänglichen Laden der Seite herausholen können, verlieren Sie (was den benutzerdefinierten Downstream-Antwortheader leider zu einem Nichtstarter macht).
Metamatt

6
Weil der Fälscher das Sitzungscookie nicht hat. Sie haben möglicherweise ein eigenes Sitzungscookie, aber da das CSRF-Token einer Sitzung zugeordnet ist, stimmt ihr CSRF-Token nicht mit dem des Opfers überein.
SilverlightFox

32
Nach meinem Verständnis des CSRF-Angriffs hat der Fälscher mein Sitzungscookie. Nun, sie sehen das Cookie nicht wirklich , aber sie haben die Möglichkeit, es in ihren gefälschten Anfragen bereitzustellen, da die Anfragen von meinem Browser kommen und mein Browser mein Sitzungscookie liefert. Aus Sicht des Servers kann das Sitzungscookie allein eine legitime Anforderung nicht von einer gefälschten Anforderung unterscheiden. Dies ist in der Tat der Angriff, den wir verhindern wollen. Übrigens, danke für Ihre Geduld, dies durchzusprechen, besonders wenn ich darüber verwirrt bin.
Metamatt

8
Sie können das Auth-Cookie bereitstellen, aber die Antwort, die das CSRF-Token enthält, können nicht gelesen werden.
SilverlightFox

8
@metamatt Entschuldigung für den Nekro, aber ich mache das für Leute, die hereinwandern. Nach meinem Verständnis hat der Angreifer normalerweise keinen Zugriff auf die Antwort. CSRF wird hauptsächlich verwendet, um Nebenwirkungen zu verursachen , anstatt Daten direkt zu erfassen. Beispielsweise kann ein CSRF-Angriffsskript einen privilegierten Benutzer dazu zwingen, die Berechtigungen des Angreifers zu eskalieren, eine Sicherheitseinstellung zu deaktivieren oder einen angemeldeten Paypal-Benutzer zu zwingen, eine Übertragung an eine bestimmte E-Mail-Adresse zu senden. In keinem dieser Fälle kümmert sich der Angreifer um die Antwort, die weiterhin an den Browser des Opfers gesendet wird. nur das Ergebnis des Angriffs.
Jonathanbruder

61

Die Verwendung eines Cookies zur Bereitstellung des CSRF-Tokens für den Client ermöglicht keinen erfolgreichen Angriff, da der Angreifer den Wert des Cookies nicht lesen und ihn daher nicht dort ablegen kann, wo es für die serverseitige CSRF-Validierung erforderlich ist.

Der Angreifer kann eine Anforderung an den Server mit dem Authentifizierungs-Token-Cookie und dem CSRF-Cookie in den Anforderungsheadern senden. Der Server sucht jedoch nicht nach dem CSRF-Token als Cookie in den Anforderungsheadern, sondern nach der Nutzlast der Anforderung. Und selbst wenn der Angreifer weiß, wo er das CSRF-Token in die Nutzlast einfügen muss, muss er seinen Wert lesen, um es dort abzulegen. Die Cross-Origin-Richtlinie des Browsers verhindert jedoch das Lesen von Cookies von der Zielwebsite.

Dieselbe Logik gilt nicht für das Authentifizierungs-Token-Cookie, da der Server dies in den Anforderungsheadern erwartet und der Angreifer nichts Besonderes tun muss, um es dort abzulegen.


Sicherlich muss ein Angreifer den Cookie überhaupt nicht lesen. Sie können einfach ein Bild auf der gehackten Site einfügen, mit src='bank.com/transfer?to=hacker&amount=1000dem der Browser dies anfordert, einschließlich der zugehörigen Cookies für diese Site ( bank.com)?
Developius

2
CSRF dient zur Validierung des Benutzers auf der Clientseite und nicht zum Schutz der Site im Allgemeinen vor einem serverseitigen Kompromiss, wie Sie vorschlagen.
Tongfa

2
Das Senden des Cookies durch @developius reicht nicht aus, um den CSRF-Schutz zu gewährleisten. Das Cookie enthält das vom Server gesendete csrf-Token. Der legitime Client muss das csrf-Token aus dem Cookie lesen und es dann in der Anforderung irgendwo weitergeben, z. B. in einem Header oder in der Nutzlast. Der CSRF-Schutz prüft, ob der Wert im Cookie mit dem Wert in der Anforderung übereinstimmt. Andernfalls wird die Anforderung abgelehnt. Daher muss der Angreifer das Cookie lesen.
Will M.

1
Diese Antwort entsprach genau der Frage des Originalplakats und war sehr klar. +1 Danke.
Java-Addict301

@Tongfa - danke, das hat mir geholfen, besser zu verstehen. Kann ich zu Recht davon ausgehen, dass das CSRF-Token NICHT in den Header eingefügt werden darf? muss es irgendwo im Körper sein?
Zerohedge

10

Meine beste Vermutung bezüglich der Antwort: Betrachten Sie diese 3 Optionen, um das CSRF-Token vom Server zum Browser zu übertragen.

  1. Im Anforderungshauptteil (kein HTTP-Header).
  2. In einem benutzerdefinierten HTTP-Header nicht Set-Cookie.
  3. Als Cookie in einem Set-Cookie-Header.

Ich denke, der erste Anfragetext (der durch das Express-Tutorial demonstriert wird, das ich in der Frage verlinkt habe ) ist für eine Vielzahl von Situationen nicht so portabel. Nicht jeder generiert jede HTTP-Antwort dynamisch. Wo Sie am Ende das Token in die generierte Antwort einfügen müssen, kann sehr unterschiedlich sein (in einer Eingabe in versteckter Form, in einem Fragment von JS-Code oder einer Variablen, auf die andere JS-Codes zugreifen können; möglicherweise sogar in einer URL, obwohl dies im Allgemeinen ein schlechter Ort zu sein scheint CSRF-Token setzen). Obwohl es mit einigen Anpassungen möglich ist, ist # 1 ein schwieriger Ort, um einen einheitlichen Ansatz zu entwickeln.

Der zweite, benutzerdefinierte Header, ist attraktiv, funktioniert aber nicht, da JS zwar die Header für eine aufgerufene XHR abrufen kann, jedoch nicht die Header für die Seite, von der es geladen wurde .

Damit bleibt das dritte, ein Cookie, das von einem Set-Cookie-Header getragen wird, ein Ansatz, der in allen Situationen einfach zu verwenden ist (jeder Server kann Cookies-Header pro Anforderung festlegen, und es spielt keine Rolle, um welche Art von Cookie es sich handelt Daten befinden sich im Anforderungshauptteil). Trotz seiner Nachteile war es die einfachste Methode, Frameworks umfassend zu implementieren.


7
Ich könnte das Offensichtliche sagen, dies bedeutet, dass Cookies nicht nur korrekt sein können?
Photon

1
Nur für Ajax-Anforderungen (wobei JS den Wert des CSRF-Cookies kennen muss, um ihn bei der nächsten Anforderung im zweiten Kanal erneut senden zu können (entweder als Formulardaten oder als Header)). Es gibt keinen Grund, das csrf-Token als HttpOnly zu bezeichnen, wenn das Sitzungscookie bereits HttpOnly ist (zum Schutz vor XSS), da das csrf-Token ohne zugeordnete Sitzung für sich genommen nicht wertvoll ist.
Cowbert

2

Neben dem Sitzungscookie (der eine Art Standard ist) möchte ich keine zusätzlichen Cookies verwenden.

Ich habe eine Lösung gefunden, die für mich beim Erstellen einer Single Page Web Application (SPA) mit vielen AJAX-Anforderungen funktioniert. Hinweis: Ich verwende serverseitiges Java und clientseitiges JQuery, aber keine magischen Dinge, daher denke ich, dass dieses Prinzip in allen gängigen Programmiersprachen implementiert werden kann.

Meine Lösung ohne zusätzliche Cookies ist einfach:

Client-Seite

Speichern Sie das CSRF-Token, das vom Server nach einer erfolgreichen Anmeldung zurückgegeben wird, in einer globalen Variablen (wenn Sie Webspeicher anstelle eines globalen verwenden möchten, ist das natürlich in Ordnung). Weisen Sie JQuery an, bei jedem AJAX-Aufruf einen X-CSRF-TOKEN-Header anzugeben.

Die Hauptseite "Index" enthält dieses JavaScript-Snippet:

// Intialize global variable CSRF_TOKEN to empty sting. 
// This variable is set after a succesful login
window.CSRF_TOKEN = '';

// the supplied callback to .ajaxSend() is called before an Ajax request is sent
$( document ).ajaxSend( function( event, jqXHR ) {
    jqXHR.setRequestHeader('X-CSRF-TOKEN', window.CSRF_TOKEN);
}); 

Serverseite

Erstellen Sie bei erfolgreicher Anmeldung ein zufälliges (und lang genug) CSRF-Token, speichern Sie dieses in der serverseitigen Sitzung und geben Sie es an den Client zurück. Filtern Sie bestimmte (vertrauliche) eingehende Anforderungen, indem Sie den X-CSRF-TOKEN-Headerwert mit dem in der Sitzung gespeicherten Wert vergleichen: Diese sollten übereinstimmen.

Sensible AJAX-Aufrufe (POST-Formulardaten und GET JSON-Daten) und der serverseitige Filter, der sie abfängt, befinden sich unter dem Pfad / dataservice / *. Anmeldeanforderungen dürfen den Filter nicht treffen, daher befinden sich diese auf einem anderen Pfad. Anforderungen für HTML-, CSS-, JS- und Bildressourcen befinden sich ebenfalls nicht im Pfad / dataservice / * und werden daher nicht gefiltert. Diese enthalten nichts Geheimnisvolles und können keinen Schaden anrichten, also ist das in Ordnung.

@WebFilter(urlPatterns = {"/dataservice/*"})
...
String sessionCSRFToken = req.getSession().getAttribute("CSRFToken") != null ? (String) req.getSession().getAttribute("CSRFToken") : null;
if (sessionCSRFToken == null || req.getHeader("X-CSRF-TOKEN") == null || !req.getHeader("X-CSRF-TOKEN").equals(sessionCSRFToken)) {
    resp.sendError(401);
} else
    chain.doFilter(request, response);
}   

Ich denke, Sie möchten CSRF auf einer Login-Anfrage. Sie scheinen das CSRF-Token auch als Anmeldesitzungstoken zu verwenden. Es funktioniert auch, sie als separate Token zu haben, und dann können Sie CSRF auf jedem Endpunkt verwenden, unabhängig davon, ob der Benutzer angemeldet ist oder nicht.
Tongfa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.