Co robi document.domain = document.domain?


90

Komponent JS po stronie klienta Orbited (serwer Comet) wymaga, aby jeśli serwer był uruchomiony w innej domenie lub porcie niż sam JS, musisz wykonać

document.domain = document.domain;

przed załadowaniem jakiegokolwiek innego JS. (Zobacz dokumentację ).

Co to robi? Wygląda jak NOOP! (Sprawdziłem i faktycznie jest to konieczne.)

Odpowiedzi:


203

Właściwie napisałem ten kod.

Podczas próby wykonania komety cross-subdomain / port, iframe musi mieć taką samą document.domainwartość jak ramka nadrzędna. Niestety, przeglądarka przechowuje wewnętrznie nazwę domeny ORAZ port dla oryginalnej document.domainwartości. Ale getter i setter w javascript nie wiedzą nic o porcie. A więc problem jest taki: jeśli górna rama document.domainjest ('example.com', 80), a dolna - to ('comet.example.com', 80)jak sprawić, by dolna rama była ('example.com', 80)również?

Nie możesz, ponieważ zmiana części nazwy hosta koniecznie spowoduje ustawienie portu null, więc najlepsze, co możesz zrobić, jest ('example.com', null)w dolnej ramce. Zatem górna rama również musi być ustawiona na tę wartość, a ustawienie document.domain=document.domainto właśnie robi. Zmienia wewnętrzną reprezentację w przeglądarce z ('example.com', 80)na, ('example.com', null)a następnie wszystko się zgadza i działa komunikacja między portami / subdomenami.


To rozwiązanie niestety nie zadziałało dla mnie (szczegóły na stackoverflow.com/questions/7796767/… ). Dodanie „document.domain = document.domain” do wszystkich ramek nie zmienia zachowania Chrome. Jakieś pomysły?
Stephen Gross

Dowiedziałem się również, że jeśli ustawię opóźnienie dla mojego js, ​​otrzymam przynajmniej poprawnie wyglądające adresy URL dla obu ramek. Jednak nadal jedna ramka nie może uzyskać dostępu do drugiej.
Stephen Gross

6
Istnieje inne wyjaśnienie, jak działa ten dziwny „ukryty” port w MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
Ach, więc jesteś winowajcą tego irytującego kodu. Dzięki tej linii, po jej uruchomieniu (i ustawieniu document.domain) każda dynamicznie utworzona ramka iframe jest ustawiana jako międzydomenowa, a tym samym do nowo utworzonej ramki iframe nie można już uzyskać dostępu. : /
crappish

@mjs yes: numer portu jest przechowywany oddzielnie przez przeglądarkę. Każde wywołanie ustawiacza, w tym document.domain = document.domain powoduje nadpisanie numeru portu wartością null. Dlatego nie można sprawić, by firma.com:8080 rozmawiała z firmą.com, ustawiając tylko document.domain = "company.com" w pierwszej. Musi być ustawiony w obu, aby oba numery portów były puste.
Royi Namir

38

Przeglądarki rozróżniają między (a) document.domain, gdy nie jest to jawnie ustawione, i (b) document.domain, gdy są jawnie ustawione ... nawet jeśli zwracają tę samą wartość.

Jawne ustawienie wartości wskazuje na zamiar „współpracy” ze skryptem w innej subdomenie (w tej samej domenie nadrzędnej).

Jeśli ZARÓWNO strona nadrzędna, jak i zewnętrzny skrypt jawnie ustawią document.domain na tę samą wartość, to ograniczenie zasad tego samego pochodzenia może zostać ominięte i każdy skrypt może uzyskać dostęp do wszystkich (w innych przypadkach ograniczonych) obiektów i właściwości kontekstów innych osób.


9

Znalazłem na tej stronie następujące informacje: devguru . Mówiąc konkretniej, oto cytat:

Ta właściwość ustawia lub zwraca nazwę domeny serwera, z którego pochodzi dokument. Domyślnie jest to nazwa domeny serwera, z którego dokument został pobrany, ale można ją zmienić na przyrostek (i tylko przyrostek) tej nazwy. Pozwala to na współdzielenie właściwości skryptu, co zapewnia bezpieczeństwo, między dokumentami dostarczonymi z różnych serwerów, pod warunkiem, że mają ten sam sufiks domeny.

Wydaje mi się, że pozwala na cross-site scripting dla tej samej domeny (nawet jeśli subdomena jest inna).

Przypuszczam, że jeśli nie dotkniesz document.domain, silnik js zezwala tylko na inne JavaScript z tej samej domeny. Dzięki tej właściwości będziesz mógł wdrażać w innych subdomenach, takich jak stan orbitowanych dokumentów.


6
Że nie wyjaśnia, dlaczego document.domain = document.domainto nie NOOP.
Crescent Fresh

1
To tylko dziwne przypuszczenie, ale jak powiedziałem, sądzę, że właściwość jest wyzwalana tylko wtedy, gdy jest ustawiona na wartość.
Miguel Ping

6

document.domainCiągnie domyślną od rzeczywistego adresu URL, jeśli nie jawnie ustawione. Przeglądarki będą rejestrować, czy document.domaindomyślnie pochodzi z adresu URL, czy też został wyraźnie ustawiony. Obie muszą być domyślne dla tej samej domeny lub obie muszą być jawnie ustawione na tę samą domenę, aby to zadziałało. Jeśli jedna jest domyślna, a druga jest jawnie ustawiona, obie pasują do siebie, jeśli zostaną przeczytane, obie strony nadal nie będą mogły ze sobą rozmawiać.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.