TLDR: Nichts hindert bösartigen Code daran, den Ursprung zu fälschen . In diesem Fall wird Ihr Server nie davon erfahren und auf die Anforderungen reagieren. Manchmal sind diese Anfragen teuer. Verwenden Sie CORS also nicht anstelle von Sicherheitsmaßnahmen.
Ich habe kürzlich mit CORS herumgespielt und mir die gleiche Frage gestellt. Ich habe festgestellt, dass der Browser möglicherweise intelligent genug ist, um eine gefälschte CORS-Anfrage zu erkennen, wenn er eine sieht, aber Ihr Server ist nicht so intelligent.
Das erste, was ich fand, war, dass der Origin
Header ein HTTP- verbotener Headername ist, der nicht programmgesteuert geändert werden kann. Das heißt, Sie können es in ca. 8 Sekunden mit " Header ändern" für Google Chrome ändern .
Um dies zu testen, habe ich zwei Client-Domänen und eine Server-Domäne eingerichtet. Ich habe eine CORS-Whitelist auf dem Server eingefügt, die CORS-Anforderungen von Client 1, aber nicht von Client 2 zuließ. Ich habe beide Clients getestet, und tatsächlich waren die CORS-Anforderungen von Client 1 erfolgreich, während Client 2 fehlgeschlagen ist.
Dann habe ich den Origin
Header von Client 2 gefälscht , damit er mit dem von Client 1 übereinstimmt. Der Server hat den gefälschten Origin
Header erhalten und die Whitelist-Prüfung erfolgreich bestanden (oder ist fehlgeschlagen, wenn Sie ein halb leerer Typ sind). Danach leistete der Server eine pflichtbewusste Leistung, indem er alle Ressourcen verbrauchte, für die er ausgelegt war (Datenbankaufrufe, Senden teurer E-Mails, Senden noch teurerer SMS-Nachrichten usw.). Als dies erledigt war, schickte der Server den gefälschten Access-Control-Allow-Origin
Header glücklich zurück an den Browser.
In der Dokumentation, die ich gelesen habe, heißt es, dass der Access-Control-Allow-Origin
empfangene Origin
Wert genau mit dem in der Anforderung gesendeten Wert übereinstimmen muss . Sie stimmten überein, daher war ich überrascht, als ich die folgende Meldung in Chrome sah:
XMLHttpRequest kann nicht geladen werden http://server.dev/test
. Der Header 'Access-Control-Allow-Origin' hat einen Wert http://client1.dev
, der nicht dem angegebenen Ursprung entspricht. Origin http://client2.dev
ist daher kein Zugriff gestattet.
Die Dokumentation, die ich gelesen habe, scheint nicht korrekt zu sein. Auf der Registerkarte "Netzwerk" von Chrome werden sowohl die Anforderungs- als auch die Antwortheader deutlich als angezeigt. http://client1.dev
Sie können jedoch an dem Fehler erkennen, dass Chrome den tatsächlichen Ursprung irgendwie kennt http://client2.dev
und die Antwort korrekt ablehnt. Was an dieser Stelle keine Rolle spielt, da der Server die gefälschte Anfrage bereits akzeptiert und mein Geld ausgegeben hat.
foo.com
) bereitgestellt wird, denAccess-Control-Allow-Origin
Header bereitstellen muss, sonst lässt der Browser die Anfrage nicht zubar.com
.