Same-Origin-Policy

Die Same-Origin-Policy ist ein kritischer Sicherheitsmechanismus, der einschränkt, wie ein Dokument oder ein Script, das von einem Origin geladen wurde, mit einer Ressource von einem anderen Origin interagieren kann.

Sie hilft, potenziell schädliche Dokumente zu isolieren und mögliche Angriffspunkte zu reduzieren. Zum Beispiel verhindert sie, dass eine bösartige Website im Internet JavaScript in einem Browser ausführt, um Daten von einem Drittanbieter-Webmail-Dienst (bei dem der Benutzer angemeldet ist) oder einem Unternehmens-Intranet (das durch das Fehlen einer öffentlichen IP-Adresse vor direktem Zugriff des Angreifers geschützt ist) zu lesen und diese Daten an den Angreifer weiterzuleiten.

Definition eines Origins

Zwei URLs haben denselben Origin, wenn das Protokoll, der Port (falls angegeben) und der Host für beide identisch sind. Dies wird auch oft als "scheme/host/port tuple" oder einfach "tuple" bezeichnet. (Ein "Tuple" ist eine Menge von Elementen, die zusammen ein Ganzes bilden – eine generische Form für Double/Triple/Quadruple/Quintuple/etc.)

Die folgende Tabelle zeigt Beispiele für Origin-Vergleiche mit der URL http://store.company.com/dir/page.html:

URL Ergebnis Grund
http://store.company.com/dir2/other.html Gleicher Origin Nur der Pfad unterscheidet sich
http://store.company.com/dir/inner/another.html Gleicher Origin Nur der Pfad unterscheidet sich
https://store.company.com/page.html Unterschiedlich Unterschiedliches Protokoll
http://store.company.com:81/dir/page.html Unterschiedlich Unterschiedlicher Port (http:// verwendet Standard-Port 80)
http://news.company.com/dir/page.html Unterschiedlich Unterschiedlicher Host

Vererbte Origins

Skripte, die von Seiten mit einer about:blank- oder javascript:-URL ausgeführt werden, erben den Origin des Dokuments, das diese URL enthält, da diese Arten von URLs keine Informationen über einen Origin-Server enthalten.

Zum Beispiel wird about:blank oft als URL für neue, leere Popup-Fenster verwendet, in die das Elternskript Inhalte schreibt (z. B. über den Mechanismus Window.open()). Wenn dieses Popup ebenfalls JavaScript enthält, würde dieses Skript denselben Origin erben wie das Skript, das es erstellt hat.

data:-URLs erhalten einen neuen, leeren Sicherheitskontext.

Origins für Dateien

Moderne Browser behandeln den Origin von Dateien, die mit dem Schema file:/// geladen werden, in der Regel als undurchsichtige Origins. Das bedeutet, dass, wenn eine Datei andere Dateien aus demselben Ordner (zum Beispiel) einbindet, nicht angenommen wird, dass sie vom gleichen Origin stammen. Dies kann CORS-Fehler auslösen.

Beachten Sie, dass die URL-Spezifikation angibt, dass der Origin von Dateien implementierungsabhängig ist. Einige Browser behandeln Dateien im selben Verzeichnis oder Unterverzeichnis dennoch als gleichen Origin, was allerdings Sicherheitsimplikationen haben kann.

Origin ändern

Warnung: Der hier beschriebene Ansatz (Verwendung des document.domain-Setters) ist veraltet, da er die durch die Same-Origin-Policy bereitgestellten Sicherheitsmechanismen untergräbt und das Origin-Modell in Browsern verkompliziert, was zu Interoperabilitätsproblemen und Sicherheitsfehlern führen kann.

Eine Seite kann ihren eigenen Origin ändern, jedoch mit einigen Einschränkungen. Ein Skript kann den Wert von document.domain auf seine aktuelle Domain oder auf eine Über-Domain seiner aktuellen Domain setzen. Wenn auf eine Über-Domain der aktuellen Domain gesetzt, wird die kürzere Über-Domain für Same-Origin-Prüfungen verwendet.

Zum Beispiel: Angenommen, ein Skript des Dokuments http://store.company.com/dir/other.html führt Folgendes aus:

js
document.domain = "company.com";

Danach kann die Seite die Same-Origin-Prüfung mit http://company.com/dir/page.html bestehen (vorausgesetzt, http://company.com/dir/page.html setzt sein document.domain auf "company.com", um anzuzeigen, dass dies erlaubt ist – siehe document.domain für mehr). company.com könnte jedoch nicht document.domain auf othercompany.com setzen, da dies keine Über-Domain von company.com ist.

Die Portnummer wird vom Browser separat überprüft. Jeder Aufruf von document.domain, einschließlich document.domain = document.domain, setzt die Portnummer auf null. Daher kann man nicht company.com:8080 dazu bringen, mit company.com zu sprechen, indem man nur document.domain = "company.com" im Ersten setzt. Es muss in beiden gesetzt werden, damit deren Portnummern beide null sind.

Der Mechanismus hat einige Einschränkungen. Beispielsweise wird ein SecurityError DOMException ausgelöst, wenn die document-domain-Permissions-Policy aktiviert ist oder das Dokument in einem sandboxed <iframe> ist. Das Ändern des Origins auf diese Weise beeinflusst nicht die Origin-Prüfungen vieler Web-APIs (z. B. localStorage, indexedDB, BroadcastChannel, SharedWorker). Eine ausführlichere Liste von Fehlerszenarien finden Sie unter Document.domain > Failures.

Hinweis: Wenn Sie document.domain verwenden, um einem Subdomain Zugriff auf die Parent-Domain zu ermöglichen, müssen Sie document.domain auf den gleichen Wert sowohl in der Parent-Domain als auch in der Subdomain setzen. Dies ist erforderlich, auch wenn Sie damit die Parent-Domain auf ihren ursprünglichen Wert zurücksetzen. Andernfalls kann es zu Berechtigungsfehlern kommen.

Netzwerkanfragen zwischen unterschiedlichen Origins

Die Same-Origin-Policy kontrolliert die Interaktionen zwischen zwei unterschiedlichen Origins, etwa wenn Sie fetch() oder ein <img>-Element verwenden. Diese Interaktionen werden typischerweise in drei Kategorien eingeteilt:

  • Zwischen-Origin-Schreiben ist in der Regel erlaubt. Beispiele sind Links, Weiterleitungen und Formular-Einreichungen. Einige HTTP-Anfragen erfordern Preflight.
  • Zwischen-Origin-Einbettung ist in der Regel erlaubt. (Beispiele werden unten aufgeführt.)
  • Zwischen-Origin-Lesen ist in der Regel nicht erlaubt, aber Lesezugriff wird oft durch Einbettung offengelegt. Zum Beispiel können Sie die Dimensionen eines eingebetteten Bildes, die Aktionen eines eingebetteten Skripts oder die Verfügbarkeit einer eingebetteten Ressource lesen.

Hier sind einige Beispiele von Ressourcen, die zwischen verschiedenen Origins eingebettet werden können:

  • JavaScript mit <script src="…"></script>. Fehlerdetails für Syntaxfehler sind nur für gleiche-Origin-Skripte verfügbar.
  • CSS, angewendet mit <link rel="stylesheet" href="…">. Aufgrund der entspannten Syntaxregeln von CSS erfordert Between-Origin-CSS einen korrekten Content-Type-Header. Browser blockieren Stylesheet-Ladevorgänge, wenn es sich um einen Between-Origin-Ladevorgang handelt, bei dem der MIME-Typ falsch ist und die Ressource nicht mit einem gültigen CSS-Konstrukt beginnt.
  • Bilder, angezeigt mit <img>.
  • Medien, wiedergegeben mit <video> und <audio>.
  • Externe Ressourcen, eingebettet mit <object> und <embed>.
  • Schriftarten, angewendet mit @font-face. Einige Browser erlauben Between-Origin-Schriftarten, andere erfordern gleiche-Origin.
  • Alles, was mit <iframe> eingebettet ist. Websites können den X-Frame-Options-Header verwenden, um Between-Origin-Framing zu verhindern.

Anleitung zur Freigabe von Between-Origin-Zugriff

Verwenden Sie CORS, um Between-Origin-Zugriff zu erlauben. CORS ist ein Teil von HTTP, der es Servern ermöglicht, anzugeben, von welchen anderen Hosts ein Browser das Laden von Inhalten zulassen soll.

Anleitung zur Blockierung von Between-Origin-Zugriff

  • Um Between-Origin-Schreiben zu verhindern, überprüfen Sie ein nicht erratbares Token in der Anfrage – bekannt als Cross-Site-Request-Forgery (CSRF)-Token. Sie müssen Between-Origin-Lesungen von Seiten, die dieses Token benötigen, verhindern.
  • Um Between-Origin-Lesungen einer Ressource zu verhindern, stellen Sie sicher, dass sie nicht einbettbar ist. Es ist oft notwendig, das Einbetten zu verhindern, da das Einbetten einer Ressource immer einige Informationen darüber preisgibt.
  • Um Between-Origin-Einbettung zu verhindern, stellen Sie sicher, dass Ihre Ressource nicht als eines der oben genannten einbettbaren Formate interpretiert werden kann. Browser respektieren möglicherweise nicht den Content-Type-Header. Wenn Sie beispielsweise ein <script>-Tag auf ein HTML-Dokument verweisen, versucht der Browser, das HTML als JavaScript zu parsen. Wenn Ihre Ressource kein Einstiegspunkt für Ihre Site ist, können Sie zur Verhinderung der Einbettung auch ein CSRF-Token verwenden.

... (Der restliche Text wird ebenso entsprechend den oben genannten Regeln übersetzt.)