Ist CORS eine sichere Möglichkeit, domänenübergreifende AJAX-Anfragen zu bearbeiten?


81

Nachdem ich über CORS (Cross-Origin Resource Sharing) gelesen habe, verstehe ich nicht, wie es die Sicherheit verbessert. Domänenübergreifende AJAX-Kommunikation ist zulässig, wenn der richtige ORIGIN-Header gesendet wird. Als Beispiel, wenn ich sende

HERKUNFT: http://example.com

Der Server prüft, ob diese Domäne in der Whitelist enthalten ist, und, falls vorhanden, den Header:

Access-Control-Allow-Origin: [URL hier erhalten]

wird zusammen mit der Antwort zurückgesendet (Dies ist der einfache Fall, es gibt auch vorgeforderte Anfragen, aber die Frage ist dieselbe).

Ist das wirklich sicher? Wenn jemand die Informationen erhalten möchte, scheint das Fälschen von ORIGIN-Headern eine wirklich triviale Aufgabe zu sein. Außerdem besagt der Standard, dass die Richtlinie im Browser erzwungen wird und die Antwort blockiert, wenn Access-Control-Allow-Origin nicht korrekt ist. Wenn jemand versucht, diese Informationen abzurufen, wird er offensichtlich keinen Standardbrowser verwenden, um sie zu blockieren.


Lesen Sie diese Antwort, wenn jemand nicht weiß
nishantbhardwaj2002

Antworten:


52

Sie können einen Origin-Header nicht mit JavaScript in einem Webbrowser fälschen. CORS soll dies verhindern.

Außerhalb eines Webbrowsers spielt es keine Rolle. Es soll Menschen nicht davon abhalten, Daten zu erhalten, die der Öffentlichkeit zugänglich sind. Sie können es nicht der Öffentlichkeit zugänglich machen, ohne dass Mitglieder der Öffentlichkeit es erhalten.

Es ist so konzipiert, dass gegeben:

  • Alice, eine Person, die eine API bereitstellt, auf die über Ajax zugegriffen werden kann
  • Bob, eine Person mit einem Webbrowser
  • Charlie, ein Dritter, der eine eigene Website betreibt

Wenn Bob Charlies Website besucht, kann Charlie JS nicht an Bobs Browser senden, damit er Daten von Alices Website abruft und an Charlie sendet.

Die obige Situation wird wichtiger, wenn Bob ein Benutzerkonto auf Alices Website hat, mit dem er beispielsweise Kommentare veröffentlichen, Daten löschen oder Daten anzeigen kann, die der Öffentlichkeit nicht zugänglich sind - da Charlie's JS ohne Schutz Bobs Browser informieren könnte um das hinter Bobs Rücken zu tun (und dann die Ergebnisse an Charlie zu senden).

Wenn Sie verhindern möchten, dass Unbefugte die Daten sehen, müssen Sie sie mit Kennwörtern, SSL-Client-Zertifikaten oder anderen Mitteln zur identitätsbasierten Authentifizierung / Autorisierung schützen.


1
Grundsätzlich sind CORS oder Cross-Origin Resource Sharing und Autorisierung zwei getrennte Dinge. Wie das Akronym andeutet, ist es tatsächlich möglich, die gemeinsame Nutzung von Ursprüngen zuzulassen. Ob ein Client dies tatsächlich darf, muss Ihre Autorisierungslogik bestimmen.
reaper_unique

149

Der Zweck ist es, dies zu verhindern -

  • Sie gehen zur Website X.
  • Der Autor der Website X hat ein böses Skript geschrieben, das an Ihren Browser gesendet wird
  • dass Skript in Ihrem Browser anmeldet Ihre Bank - Website läuft und tut Sachen böse und weil es läuft , wie Sie in Ihrem Browser es die Erlaubnis dazu hat.

Die Idee ist, dass die Website Ihrer Bank eine Möglichkeit benötigt, Ihrem Browser mitzuteilen, ob Skripten auf Website X für den Zugriff auf Seiten Ihrer Bank vertrauenswürdig sein sollten.


9
Ihre Antwort war auch sehr klar, danke. Ich kann nicht upvoten, weil es 15 Ruf erfordert.
Gibarian2001

CORS schützt also nicht die Integrität einer App auf der Website X, sondern die Integrität der BANK, die besagt, dass Web X für die API-Aufrufe an die BANK vertrauenswürdig ist.
luigi7up

7
@ luigi7up: Nein, CORS schützt nichts, sondern "schwächt" die Sicherheit, indem es Ausnahmen von SOP definiert. Der Access-Control-Allow-OriginHeader gibt an, welche Ursprünge (im OriginHeader angegeben) auf die Ressource zugreifen dürfen. Normalerweise dürfen nur Anfragen mit demselben Ursprung dies tun. Der wichtigste Teil hier ist: Das Zulassen / Verweigern wird vom BROWSER erzwungen, nicht vom Server. Dies bedeutet, dass der Access-Control-Allow-OriginIhren Browser schützt, nicht die Ressource auf dem Server oder den Server selbst.
daniel f.

Was hindert den Autor der Website X daran, Sie über sein Website-Backend bei der Bank anzumelden, das dann als Proxy verwendet wird? Es ist nur eine zusätzliche Ebene, die er erstellen müsste, aber es würde das CORS-Problem, das er im Browser haben würde, vollständig umgehen, denke ich. Dies scheint also ein Nur-Browser-Schutz zu sein, der mir ziemlich bedeutungslos erscheint, wenn Sie ihn umgehen können auf sehr einfache Weise ..
pootzko

1
@pootzko: In Ihrem Szenario hätte die böswillige Website X keine gültige Sitzung für die Banking-Website. Selbst wenn das Opfer in seinem Banking angemeldet ist (z. B. auf einer anderen Registerkarte), hätte die böswillige Site X aufgrund der vom Browser erzwungenen Cookie-Richtlinie keinen Zugriff auf diese Sitzung: Der Browser würde niemals das Sitzungscookie des Browsers senden bank zur website X.
daniel f.

64

Nur um die Antwort von @jcoder hinzuzufügen, geht es im OriginHeader nicht darum, die auf einem Server angeforderten Ressourcen zu schützen. Diese Aufgabe liegt auf andere Weise beim Server selbst, gerade weil ein Angreifer diesen Header tatsächlich mit den entsprechenden Tools fälschen kann.

Der Zweck des OriginHeaders besteht darin, den Benutzer zu schützen. Das Szenario ist das folgende:

  • Ein Angreifer erstellt eine schädliche Website M.

  • Ein Benutzer Alice wird dazu verleitet, eine Verbindung zu M herzustellen, das ein Skript enthält, das versucht, einige Aktionen über CORS auf einem Server B auszuführen, der CORS tatsächlich unterstützt

  • B wird wahrscheinlich kein M in seiner Access-Control-Allow-OriginKopfzeile haben, denn warum sollte es?

  • Der Dreh- und Angelpunkt ist, dass M keine Möglichkeit hat, den OriginHeader zu fälschen oder zu überschreiben , da die Anforderungen von Alices Browser initiiert werden. Ihr Browser setzt also (richtig) Originauf M, was nicht in Access-Control-Allow-OriginB ist, daher schlägt die Anfrage fehl.

Alice könnte den OriginHeader selbst ändern , aber warum sollte sie es tun, da dies bedeuten würde, dass sie sich selbst Schaden zufügt?

TL; DR: Der OriginHeader schützt den unschuldigen Benutzer. Es werden keine Ressourcen auf einem Server gesichert. Es kann von einem Angreifer auf seiner eigenen Maschine gefälscht werden, aber es kann nicht auf einer Maschine gefälscht werden, die nicht unter seiner Kontrolle steht.

Server sollten ihre Ressourcen weiterhin schützen, da ein übereinstimmender OriginHeader keinen autorisierten Zugriff bedeutet. Ein OriginHeader, der NICHT übereinstimmt, bedeutet jedoch einen nicht autorisierten Zugriff.


11
Sehr schöne Antwort. Das beste insgesamt IMHO.
Petersaints

Warum war dies nicht die gewählte Antwort? Das ist eindeutig das Beste. Der vierte Punkt, der in dieser Antwort erwähnt wird, ist das, wonach das Poster wirklich fragt.
Alaboudi

beste Antwort Daniel. Dies ist der springende Punkt von CORS: "Der entscheidende Punkt ist, dass M keine Möglichkeit hat, den Origin-Header zu fälschen oder zu überschreiben, da die Anforderungen vom ALICE-Browser initiiert werden. Ihr Browser setzt also den (richtigen) Origin auf M, was befindet sich nicht im Access-Control-Allow-Origin von B, daher schlägt die Anforderung fehl. "
Lukas Lukac

14

Der Zweck derselben Ursprungsrichtlinie besteht nicht darin, Personen daran zu hindern, allgemein auf Website-Inhalte zuzugreifen. Wenn jemand das tun möchte, braucht er nicht einmal einen Browser. Der Punkt besteht darin, zu verhindern, dass Client-Skripte ohne die erforderlichen Zugriffsrechte auf Inhalte einer anderen Domäne zugreifen. Siehe Wikipedia-Eintrag für Same Origin Policy .


2
"Der Punkt ist, Client-Skripte daran zu hindern, auf Inhalte in einer anderen Domäne zuzugreifen", wurde dies mit der Same Origin-Richtlinie gelöst. Nein? Ich meine, meine Website sendet Ihnen JS und Ihr Browser erlaubt keine Ajax-Anrufe an eine andere Domain. das ist die gleiche Ursprungspolitik. CORS macht genau das Gegenteil - ermöglicht meinem Ajax den Zugriff auf die andere Domain. Ich vermisse hier etwas
Großes

zu @ luigi7up: Ja, CORS macht das Gegenteil. Damit kann der Eigentümer einer Website von mehr als einer vertrauenswürdigen Domäne aus Zugriff auf seine Dienste gewähren.
SergeyT

6

Nachdem ich über CORS gelesen habe, verstehe ich nicht, wie es die Sicherheit verbessert.

CORS verbessert die Sicherheit nicht. CORS bietet Servern einen Mechanismus, mit dem sie Browsern mitteilen können, wie fremde Domänen auf sie zugreifen sollen, und dies auf eine Weise, die mit dem vor CORS vorhandenen Browsersicherheitsmodell (nämlich der Richtlinie für denselben Ursprung ) übereinstimmt .

Die Same Origin Policy und CORS haben jedoch einen begrenzten Geltungsbereich. Insbesondere hat die CORS-Spezifikation selbst keinen Mechanismus zum Ablehnen von Anforderungen. Mithilfe von Headern kann der Browser angewiesen werden, dass eine Seite einer fremden Domain keine Antwort liest. Bei Preflight-Anfragen kann der Browser aufgefordert werden, bestimmte Anfragen von einer fremden Domain nicht zu senden. CORS gibt jedoch keine Möglichkeit für den Server an, eine tatsächliche Anforderung abzulehnen (dh nicht auszuführen).

Nehmen wir ein Beispiel. Ein Benutzer ist Aüber ein Cookie auf der Website angemeldet . Der Benutzer lädt eine schädliche Site M, die versucht, ein Formular zu senden, das eine POSTan A. Was wird passieren? Nun, mit oder ohne CORS und mit oder ohne Meine erlaubte Domain, sendet der Browser die Anfrage Amit dem Autorisierungscookie des Benutzers an und der Server führt den böswilligen Vorgang aus, POSTals ob der Benutzer ihn initiiert hätte.

Dieser Angriff wird als Cross-Site Request Forgery bezeichnet , und CORS selbst unternimmt nichts, um ihn zu mildern. Aus diesem Grund ist der CSRF-Schutz so wichtig, wenn Sie zulassen, dass Anforderungen Daten im Namen von Benutzern ändern.

Jetzt kann die Verwendung des OriginHeaders ein wichtiger Bestandteil Ihres CSRF-Schutzes sein. In der Tat ist die Überprüfung Teil der aktuellen Empfehlung für eine mehrstufige CSRF-Verteidigung . Diese Verwendung des OriginHeaders fällt jedoch nicht in die CORS-Spezifikation.

Insgesamt ist CORS eine nützliche Spezifikation für die Erweiterung des vorhandenen Sicherheitsmodells der Same Origin Policy auf andere akzeptierte Domänen. Es erhöht die Sicherheit nicht, und Websites benötigen dieselben Verteidigungsmechanismen wie vor CORS.


1

Ich bin spät dran zu antworten, aber ich glaube nicht, dass ein Beitrag hier wirklich die gesuchte Antwort liefert. Der größte Vorteil sollte sein, dass der Browser der Agent ist, der den originHeader-Wert schreibt . Ein böses Skript kann den originHeader-Wert nicht schreiben . Wenn der Server mit einem Access-Control-Allow-OriginHeader antwortet , versucht der Browser sicherzustellen, dass dieser Header den originzuvor gesendeten Wert enthält . Wenn nicht, wird ein Fehler ausgelöst und der Wert nicht an das anfordernde Skript zurückgegeben. Die anderen Antworten auf diese Frage stellen ein gutes Szenario dar, wenn Sie eine Antwort auf das böse Skript ablehnen möchten.

@daniel f bietet auch eine gute Antwort auf die Frage

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.