Was macht document.domain = document.domain?

89

Die clientseitige JS-Komponente von Orbited (ein Comet-Server) erfordert, dass Sie ausgeführt werden, wenn der Server in einer anderen Domäne oder einem anderen Port als der JS selbst ausgeführt wird

document.domain = document.domain;

bevor ein anderes JS geladen wird. (Siehe Dokumentation .)

Was macht das? Es sieht aus wie ein NOOP! (Ich habe überprüft und es ist in der Tat notwendig.)

mjs
quelle

Antworten:

202

Ich habe diesen Code tatsächlich geschrieben.

Beim Versuch, einen Subdomänen- / Port-Kometen auszuführen, muss der Iframe denselben document.domainWert wie der übergeordnete Frame haben. Leider speichert der Browser den Domainnamen UND den Port intern für den ursprünglichen document.domainWert. Aber der Getter und Setter in Javascript weiß nichts über den Port. So das Problem ist: Wenn der obere Rahmen document.domainist ('example.com', 80), und der untere Rahmen ist ('comet.example.com', 80), wie Sie der untere Rahmen zu sein bekommen ('example.com', 80)auch?

Dies ist nicht möglich, da das Ändern des Hostnamen-Teils zwangsläufig dazu führt, dass der Port auf gesetzt nullwird. Das Beste, was Sie tun können, ist ('example.com', null)im unteren Frame. Daher muss auch der obere Frame auf diesen Wert eingestellt werden, und die Einstellung document.domain=document.domainmacht genau das. Es ändert die interne Darstellung im Browser von ('example.com', 80)nach ('example.com', null)und dann stimmt alles überein und die Kommunikation zwischen Port und Subdomain funktioniert.

Michael Carter
quelle
Diese Lösung hat bei mir leider nicht funktioniert ( Details siehe stackoverflow.com/questions/7796767/… ). Das Hinzufügen von 'document.domain = document.domain' zu allen Frames ändert nichts am Verhalten von Chrome. Irgendwelche Ideen?
Stephen Gross
Außerdem habe ich herausgefunden, dass ich, wenn ich eine Verzögerung für mein js einstelle, zumindest gültig aussehende URLs für beide Frames erhalte. Ein Frame kann jedoch nicht auf den anderen zugreifen.
Stephen Gross
6
Es gibt eine weitere Erklärung, wie der seltsame "versteckte" Port bei MDN funktioniert: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs
1
Ah, Sie sind also der Schuldige für dieses ärgerliche Stück Code. Dank dieser Zeile wird nach dem Ausführen (und dem Festlegen der document.domain) jeder dynamisch erstellte Iframe als domänenübergreifend festgelegt, sodass auf den neu erstellten Iframe nicht mehr zugegriffen werden kann. : /
crappish
@mjs yes: Die Portnummer wird vom Browser separat
Royi Namir
38

Browser unterscheiden zwischen (a) document.domain, wenn nicht explizit festgelegt, und (b) document.domain, wenn explizit festgelegt ... auch wenn sie denselben Wert zurückgeben.

Das explizite Festlegen des Werts zeigt die Absicht an, mit einem Skript in einer anderen Subdomäne (unter derselben übergeordneten Domäne) "zusammenzuarbeiten".

Wenn sowohl die übergeordnete Seite als auch das externe Skript document.domain explizit auf denselben Wert setzen, kann die Richtlinieneinschränkung mit demselben Ursprung umgangen werden und jedes Skript kann auf alle (ansonsten eingeschränkten) Objekte und Eigenschaften der Kontexte des jeweils anderen zugreifen.

zweiwöchentlich
quelle
9

Ich habe die folgenden Informationen auf dieser Seite gefunden: devguru . Genauer gesagt, hier ist das Zitat:

Diese Eigenschaft legt den Domänennamen des Servers fest oder gibt diesen zurück, von dem das Dokument stammt. Dies ist standardmäßig der Domänenname des Servers, von dem das Dokument abgerufen wurde, kann jedoch in ein Suffix (und nur ein Suffix) dieses Namens geändert werden. Dies ermöglicht die gemeinsame Nutzung von Skripteigenschaften, sofern die Sicherheit dies zulässt, zwischen Dokumenten, die von verschiedenen Servern bereitgestellt werden, sofern sie dasselbe Domänensuffix verwenden.

Es scheint mir, dass es Cross-Site-Scripting für dieselbe Domain ermöglicht (auch wenn die Subdomain unterschiedlich ist).

Ich würde annehmen, dass die js-Engine nur andere Javascripts aus derselben Domain zulässt, wenn Sie document.domain nicht berühren. Mit dieser Eigenschaft können Sie in anderen Unterdomänen wie dem Status der umlaufenden Dokumente bereitstellen .

Miguel Ping
quelle
6
Das erklärt nicht, warum document.domain = document.domaines kein NOOP ist.
Crescent Fresh
1
Nur eine wilde Vermutung, aber wie gesagt, ich denke, dass die Eigenschaft nur ausgelöst wird, wenn sie auf einen Wert gesetzt wird.
Miguel Ping
6

Das document.domainzieht einen Standard von der tatsächlichen URL wenn nicht explizit festgelegt. Browser zeichnen auf, ob document.domaindie URL standardmäßig verwendet wurde oder ob sie explizit festgelegt wurde. Beide müssen ein Standard für dieselbe Domäne sein oder beide müssen explizit auf dieselbe Domäne festgelegt sein, damit dies funktioniert. Wenn eine Standardeinstellung ist und eine explizit festgelegt ist und beide beim Lesen übereinstimmen, ist es den beiden Seiten weiterhin untersagt, miteinander zu sprechen.

Siehe: https://developer.mozilla.org/en-US/docs/DOM/document.domain

Charlie
quelle