Ich schreibe eine Anwendung (Django, das passiert auch) und möchte nur eine Vorstellung davon haben, was ein "CSRF-Token" eigentlich ist und wie es die Daten schützt. Sind die Post-Daten nicht sicher, wenn Sie keine CSRF-Token verwenden?
628
Antworten:
Cross-Site Request Forgery (CSRF) in einfachen Worten
www.mybank.com
mybank.com
führt zu einer Anforderung (konzeptionell) des Formularshttp://www.mybank.com/transfer?to=<SomeAccountnumber>;amount=<SomeAmount>
. (Ihre Kontonummer wird nicht benötigt, da dies durch Ihre Anmeldung impliziert wird.)www.cute-cat-pictures.org
, ohne zu wissen, dass es sich um eine bösartige Website handelt.mybank.com
(erfordert etwas Glück!), Könnte er auf seiner Seite eine Anfrage wiehttp://www.mybank.com/transfer?to=123456;amount=10000
(wo123456
ist die Nummer seines Cayman Islands-Kontos) einfügen und10000
ist ein Betrag, von dem Sie vorher dachten, dass Sie ihn gerne besitzen würden).www.cute-cat-pictures.org
Seite abgerufen , sodass Ihr Browser diese Anfrage stellt.www.mybank.com
Cookie und sie sieht absolut legitim aus. Da geht dein Geld!Dies ist die Welt ohne CSRF-Token .
Nun zum Besseren mit CSRF-Token :
http://www.mybank.com/transfer?to=123456;amount=10000;token=31415926535897932384626433832795028841971
.mybank.com
die auf ihrer eigenen Webseite angezeigt wird, wenn sie Ihnen bereitgestellt wird. Es ist jedes Mal anders, wenn sie jemandem eine Seite zur Verfügung stellen.www.mybank.com
.Ergebnis: Sie behalten Ihre
10000
Geldeinheiten. Ich schlage vor, Sie spenden etwas davon an Wikipedia.(Ihr Kilometerstand kann variieren.)
BEARBEITEN von lesenswertem Kommentar:
Es ist zu beachten, dass das Skript von
www.cute-cat-pictures.org
normalerweisewww.mybank.com
aufgrund der HTTP-Zugriffskontrolle keinen Zugriff auf Ihr Anti-CSRF-Token hat . Dieser Hinweis ist wichtig für einige Personen, die unangemessen einen HeaderAccess-Control-Allow-Origin: *
für jede Website-Antwort senden, ohne zu wissen, wofür er bestimmt ist, nur weil sie die API von einer anderen Website nicht verwenden können.quelle
www.cute-cat-pictures.org
normalerweisewww.mybank.com
aufgrund der HTTP-Zugriffskontrolle keinen Zugriff auf Ihr Anti-CSRF-Token hat . Dieser Hinweis ist wichtig für einige Personen, die unangemessen einen HeaderAccess-Control-Allow-Origin: *
für jede Website-Antwort senden, ohne zu wissen, wofür er bestimmt ist, nur weil sie die API von einer anderen Website nicht verwenden können.Ja, die Postdaten sind sicher. Der Ursprung dieser Daten ist jedoch nicht. Auf diese Weise kann jemand Benutzer mit JS dazu verleiten, sich bei Ihrer Website anzumelden, während er die Webseite des Angreifers durchsucht.
Um dies zu verhindern, sendet django einen zufälligen Schlüssel sowohl im Cookie als auch in Formulardaten. Wenn Benutzer POSTs senden, wird überprüft, ob zwei Schlüssel identisch sind. Wenn der Benutzer betrogen wird, kann die Website eines Drittanbieters die Cookies Ihrer Website nicht abrufen, was zu einem Authentifizierungsfehler führt.
quelle
Die Site generiert ein eindeutiges Token, wenn sie die Formularseite erstellt. Dieses Token ist erforderlich, um Daten an den Server zurückzusenden.
Da das Token von Ihrer Site generiert und nur bereitgestellt wird, wenn die Seite mit dem Formular generiert wird, kann eine andere Site Ihre Formulare nicht nachahmen - sie haben das Token nicht und können daher nicht auf Ihrer Site posten.
quelle
Der Cloud Under-Blog bietet eine gute Erklärung für CSRF-Token.
quelle
Der Grund dafür ist, sicherzustellen, dass die Anforderungen von den tatsächlichen Benutzern der Site stammen. Für die Formulare wird ein CSRF-Token generiert, das an die Sitzungen des Benutzers gebunden sein muss. Es wird verwendet, um Anforderungen an den Server zu senden, auf dem das Token sie überprüft. Dies ist eine Möglichkeit zum Schutz vor CSRF, eine andere wäre die Überprüfung des Referrer-Headers.
quelle