2009-09-26 8 views
73

Die clientseitige JS Komponente von Orbited (a Comet-Server), das erfordert, wenn der Server in einer anderen Domäne oder Port mit dem JS selbst ausgeführt wird, SieWas macht document.domain = document.domain?

document.domain = document.domain; 

vor allen anderen JS ausführen muss, ist loaded . (Siehe die documentation.)

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

Antwort

175

Ich habe diesen Code tatsächlich geschrieben.

Wenn versucht wird, Cross-Subdomain/Port-Comet zu erstellen, muss der Iframe denselben document.domain-Wert wie der übergeordnete Frame haben. Leider speichert der Browser intern den Domänennamen AND-Port für den ursprünglichen Wert document.domain. Aber der Getter und Setter in Javascript weiß nichts über den Port. Also das Problem ist das: Wenn der obere Rahmen document.domain('example.com', 80) ist, und der untere Rahmen ist ('comet.example.com', 80), wie erhalten Sie den unteren Rahmen zu ('example.com', 80) als auch?

Sie können nicht, da das Ändern der Hostname Teil wird zwangsläufig dazu führen, dass der Port auf null gesetzt wird, so dass Sie am besten ('example.com', null) im unteren Rahmen tun können. Also muss der obere Rahmen auch auf diesen Wert eingestellt werden, und die Einstellung document.domain=document.domain tut genau das. Es ändert die interne Darstellung im Browser von ('example.com', 80) zu ('example.com', null) und dann stimmt alles überein und Cross-Port/Subdomain Frame-Kommunikation funktioniert.

+80

+1 für den ersten Satz :) –

+0

Diese Lösung hat leider nicht für mich funktioniert (siehe http://stackoverflow.com/questions/7796767/is-it-possible-to-alter-one-frame-from-and-) using-javascript für Details). Das Hinzufügen von "document.domain = document.domain" zu allen Frames ändert nicht das Verhalten von Chrome. Irgendwelche Ideen? –

+0

Außerdem habe ich herausgefunden, dass ich, wenn ich eine Verzögerung für meine js einstelle, zumindest gültige URLs für beide Frames bekomme. Dennoch kann ein Frame nicht auf den anderen zugreifen. –

9

Ich habe folgende Informationen auf dieser Website gefunden: devguru. Genauer gesagt, hier ist das Zitat:

Diese Eigenschaft setzt oder gibt den Domain-Namen des Servers, von dem das Dokument stammt. Dieser Standardwert auf den Domänennamen des Servers, der das Dokument wurde abgerufen, aber kann in ein Suffix (und nur ein Suffix) dieses Namens geändert werden. Dies ermöglicht die Freigabe von Skripteigenschaften, Sicherheit ermöglicht, zwischen den Dokumenten von verschiedenen Servern geliefert, vorausgesetzt, sie teilen die gleiche Domain-Suffix.

Es scheint mir, dass es Cross Site Scripting für die gleiche Domäne ermöglicht (auch wenn Subdomäne anders ist).

Ich würde annehmen, dass wenn Sie nicht document.domain berühren, die js-Engine nur andere Javascripts von derselben Domäne erlaubt. Mit dieser Eigenschaft können Sie die anderen Subdomains wie den Orbitstatus des Dokuments bereitstellen.

+6

das erklärt nicht, warum 'document.domain = document.domain' ist * nicht * eine NOOP. –

+1

Nur eine wilde Vermutung, aber wie ich schon sagte, ich denke, dass die Eigenschaft nur ausgelöst wird, wenn es auf einen Wert festgelegt ist. –

29

Browser unterscheidet zwischen (a) document.domain wenn nicht explizit und (b) document.domain gesetzt, wenn explizit gesetzt ... auch wenn sie den gleichen Wert zurück.

Durch explizites Festlegen des Werts wird die Absicht angezeigt, mit einem Skript in einer anderen Subdomäne (unter derselben übergeordneten Domäne) zusammenzuarbeiten.

Wenn sowohl die Elternseite UND das externe Skript explizit Dokument festlegen.Wenn die Domäne denselben Wert hat, kann die Richtlinieneinschränkung der gleichen Herkunft umgangen werden, und jedes Skript kann auf alle (ansonsten eingeschränkten) Objekte und Eigenschaften der jeweiligen Kontexte zugreifen.

+5

Ihr erster Satz ist ein äußerst kritisches Detail, um dieses Problem zu verstehen. Vielen Dank! –

+0

Sie sind herzlich willkommen! Ich bin froh, dass es hilfreich war. :) – cweekly

6

Die document.domain zieht einen Standard von der tatsächlichen URL, wenn sie nicht explizit festgelegt wurde. Browser werden aufzeichnen, wenn document.domain als Standard von der URL gekommen ist oder wenn sie explizit festgelegt wurde. Beide müssen eine Standardeinstellung für dieselbe Domäne sein, oder beide müssen explizit auf dieselbe Domäne festgelegt sein, damit dies funktioniert. Wenn einer der Standardwerte ist und einer explizit eingestellt ist, werden beide Seiten beim Lesen nicht miteinander kommunizieren können.

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

Verwandte Themen