So wie ich es verstehe, muss ein clientseitiges Skript, das auf einer Seite von foo.com ausgeführt wird, Daten von bar.com anfordern möchte, in der Anforderung den Header angeben Origin: http://foo.com
und bar muss mit antworten Access-Control-Allow-Origin: http://foo.com
.
Was kann verhindern, dass bösartiger Code von der Website roh.com einfach den Header fälscht Origin: http://foo.com
, um Seiten von der Leiste anzufordern?
javascript
ajax
http
cors
Jay Lamont
quelle
quelle
foo.com
) bereitgestellt wird, denAccess-Control-Allow-Origin
Header bereitstellen muss, sonst lässt der Browser die Anfrage nicht zubar.com
.Antworten:
Browser haben die Kontrolle über das Festlegen des
Origin
Headers, und Benutzer können diesen Wert nicht überschreiben. Sie werden also nicht sehen, dass derOrigin
Header von einem Browser gefälscht wird. Ein böswilliger Benutzer könnte eine Curl-Anforderung erstellen, mit der derOrigin
Header manuell festgelegt wird. Diese Anforderung kommt jedoch von außerhalb eines Browsers und enthält möglicherweise keine browserspezifischen Informationen (z. B. Cookies).Denken Sie daran: CORS ist keine Sicherheit. Verlassen Sie sich nicht auf CORS, um Ihre Site zu sichern. Wenn Sie geschützte Daten bereitstellen, verwenden Sie Cookies oder OAuth-Token oder etwas anderes als den
Origin
Header, um diese Daten zu sichern. DerAccess-Control-Allow-Origin
Header in CORS gibt nur vor, welche Ursprünge Ursprungsübergreifende Anforderungen stellen dürfen. Verlassen Sie sich nicht mehr darauf.quelle
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älschtenOrigin
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älschtenAccess-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
empfangeneOrigin
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: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 kennthttp://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.quelle
There's nothing stopping malicious code from spoofing the origin
-> Ja, Javascript kann nicht eingestellt werdenOrigin
. Ja, ein Benutzer kann seinen Browser ändern / Fiddler verwenden, um den Ursprung zu ändern, aber das ist nicht das, gegen das sich CORS verteidigt. Von Angreifern kontrollierte Websites können Origin nicht ändern, was alles ist, was zählt.Nur eine bescheidene Zusammenfassung:
F: Wird die Same Origin Policy (SOP) nur von Browsern erzwungen?
A: Ja. Für alle Anrufe, die Sie in einem Browser tätigen, wird die SOP definitiv vom Browser angewendet. Der Server überprüft möglicherweise den Ursprung der Anforderung oder nicht.
F: Wenn eine Anfrage nicht der SOP entspricht, blockiert der Browser sie?
A: Nein, es liegt außerhalb der Autorität von Browsern. Browser senden nur Ursprungsübergreifende Anfragen und warten auf die Antwort, um festzustellen, ob der Anruf vom Server über
Access-Control
- * Header als legitim signalisiert wird . Wenn der Server keinenAccess-Control-Allow-Origin
Header zurücksendet, den Ursprung des Anrufers nicht zurücksendet oder*
den Header nicht zurücksendet, unterlässt ein Browser lediglich die Antwort an den Anrufer.F: Bedeutet das, dass ich nicht fälschen kann
Origin
?A: Im Browser und bei Verwendung von Skripten können Sie nicht überschreiben,
Origin
da dies in der Kontrolle des Browsers liegt. Wenn Sie sich jedoch selbst hacken möchten, können Sie die von Ihrem Browser ausgehenden Anrufe mithilfe von Browsererweiterungen oder anderen auf Ihrem Computer installierten Tools manipulieren. Sie können auch ausgebenHTTP
Anrufe mitcurl
,Python
,C#
, etc. und die ändernOrigin
Header Trick - Server.F: Wenn ich also den Server durch Ändern austricksen kann
Origin
, bedeutet das, dass erCORS
nicht sicher ist?A:
CORS
per se schweigt über Sicherheit - dh Authentifizierung und Autorisierung von Anforderungen. Es liegt an den Servern, Anforderungen zu überprüfen und sie durch jeden Mechanismus, mit dem sie arbeiten, wie Cookies und Header, zu authentifizieren / zu autorisieren. Trotzdem kann es uns bei Angriffen wie XSS ein bisschen mehr schützen:Beispiel: Angenommen, Sie haben sich auf Ihrer Website angemeldet und ein böswilliges Skript versucht, eine Anfrage an Ihre Bank-Website zu senden, um Ihr Guthaben abzufragen : ein Reflected XSS- Angriff. Ihre Bank-Website vertraut den Anmeldeinformationen, die von (hier im Namen Ihrer) Website stammen, sodass die Anfrage authentifiziert und eine
HTTP
Antwort auf den Schadcode ausgegeben wird. Wenn es Ihrer Bank-Website nicht darum geht, ihre Endpunkte mit anderen Ursprüngen zu teilen, wird dies nicht berücksichtigtAccess-Control-Allow-Origin
Header in der Antwort. Bei Eingang der Anforderung erkennt der Browser nun, dass es sich bei der Anforderung um eine Cross Origins-Anforderung handelt. Die Antwort zeigt jedoch nicht, dass der Server die Ressource (hier den Endpunkt der Kontostandabfrage) gerne für Ihre Website freigegeben hat. Es unterbricht also den Fluss, sodass das zurückgegebene Ergebnis niemals den Schadcode erreicht.quelle