Same-Origin-Policy

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

Sie hilft, potenziell bösartige Dokumente zu isolieren und somit mögliche Angriffspunkte zu reduzieren. Zum Beispiel verhindert sie, dass eine bösartige Website im Internet JavaScript im 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 durch den Angreifer geschützt ist) zu lesen und diese Daten an den Angreifer zu übermitteln.

Definition eines Origin

Zwei URLs haben dasselbe Origin, wenn das Protokoll, der Port (falls angegeben) und der Host für beide identisch sind. Dies wird oft als "scheme/host/port tuple" oder einfach "Tuple" bezeichnet. (Ein "Tuple" ist eine Menge von Elementen, die zusammen ein Ganzes bilden – eine allgemeine Form für Doppel/Tripel/Vierfach/Fünffach/etc.)

Die folgende Tabelle gibt 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 Gleiches Origin Nur der Pfad unterscheidet sich
http://store.company.com/dir/inner/another.html Gleiches 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:// ist standardmäßig Port 80)
http://news.company.com/dir/page.html Unterschiedlich Unterschiedlicher Host

Geerbte Origins

Skripte, die von Seiten mit einer about:blank oder einer javascript: URL ausgeführt werden, erben das 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 häufig als URL für neue, leere Popup-Fenster verwendet, in die das übergeordnete Skript Inhalte schreibt (z.B. über den Window.open()-Mechanismus). Wenn dieses Popup auch JavaScript enthält, würde dieses Skript dasselbe Origin erben wie das Skript, das es erstellt hat.

data: URLs erhalten einen neuen, leeren Sicherheitskontext.

Datei-Origins

Moderne Browser behandeln das Origin von Dateien, die mit dem Schema file:/// geladen werden, in der Regel als opake Origins. Das bedeutet, dass, wenn eine Datei andere Dateien aus demselben Ordner (zum Beispiel) einbindet, diese nicht als aus demselben Origin stammend angenommen werden, was zu CORS-Fehlern führen kann.

Beachten Sie, dass die URL-Spezifikation besagt, dass das Origin von Dateien implementierungsabhängig ist, und einige Browser Dateien im selben Verzeichnis oder Unterverzeichnis als gleiches Origin behandeln können, obwohl dies Sicherheitsimplikationen hat.

Änderung des Origin

Warnung: Der hier beschriebene Ansatz (Verwendung des document.domain-Setters) wird als veraltet angesehen, da er die von der Same-Origin-Policy bereitgestellten Sicherheitsvorkehrungen untergräbt und das Origin-Modell in Browsern komplizierter machen, was zu Interoperabilitätsproblemen und Sicherheitsfehlern führen kann.

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

Zum Beispiel, nehmen wir an, ein Skript von dem Dokument unter http://store.company.com/dir/other.html führt Folgendes aus:

js
document.domain = "company.com";

Danach kann die Seite den Same-Origin-Check mit http://company.com/dir/page.html bestehen (unter der Voraussetzung, dass http://company.com/dir/page.html sein document.domain auf "company.com" setzt, um anzuzeigen, dass es dies erlauben möchte - siehe document.domain für mehr). Jedoch könnte company.com nicht sein document.domain auf othercompany.com setzen, da dies keine Überdomain von company.com ist.

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

Der Mechanismus hat einige Einschränkungen. Zum Beispiel wird er eine SecurityError DOMException auslösen, wenn das Dokument in einem sandboxed