Что делает document.domain = document.domain?

91

Клиентский JS-компонент Orbited (сервер Comet) требует, чтобы, если сервер работает в другом домене или порту, отличном от самого JS, вы должны выполнить

document.domain = document.domain;

перед загрузкой любого другого JS. (См. Документацию .)

Что это значит? Похоже на NOOP! (Я проверил, это действительно необходимо.)

mjs
источник

Ответы:

205

Я действительно написал этот код.

При попытке выполнить комету между субдоменами и портами, iframe должен иметь то же document.domainзначение, что и родительский фрейм. К сожалению, браузер сохраняет внутреннее имя домена и порт для исходного document.domainзначения. Но геттер и сеттер в javascript ничего не знают о порте. Таким образом, проблема заключается в следующем: если верхняя рама document.domainнаходится ('example.com', 80), а нижняя рама ('comet.example.com', 80), как вы получите в нижней рамки , чтобы быть ('example.com', 80), а?

Вы не можете, так как изменение части имени хоста обязательно приведет к установке порта null, поэтому лучшее, что вы можете сделать, это ('example.com', null)в нижнем фрейме. Таким образом, верхний фрейм также должен быть установлен на это значение, и настройка document.domain=document.domainделает именно это. Он изменяет внутреннее представление в браузере с ('example.com', 80)на, ('example.com', null)а затем все совпадает, и кросс-портовая / субдоменная связь работает.

Майкл Картер
источник
К сожалению, это решение не сработало для меня (подробнее см. Stackoverflow.com/questions/7796767/… ). Добавление «document.domain = document.domain» во все фреймы не меняет поведения Chrome. Есть идеи?
Стивен Гросс
Кроме того, я понял, что если я установлю задержку для своих js, я, по крайней мере, получу действительные URL-адреса для обоих фреймов. Тем не менее, один кадр не может получить доступ к другому.
Стивен Гросс
6
Есть еще одно объяснение того, как странный «скрытый» порт работает в MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs
1
Ах, значит, вы виноваты в этом бешеном фрагменте кода. Благодаря этой строке после ее запуска (и установки document.domain) любой динамически созданный iframe устанавливается как междоменный, и, таким образом, вновь созданный iframe больше не может быть доступен. : /
дрянной 05
@mjs yes: номер порта хранится браузером отдельно. Любой вызов установщика, включая document.domain = document.domain, приводит к перезаписи номера порта нулевым значением. Следовательно, нельзя заставить company.com:8080 взаимодействовать с company.com, установив только document.domain = "company.com" в первом. Он должен быть установлен в обоих так, чтобы номера портов были нулевыми.
Рой Намир
38

Браузеры различают (а) document.domain, если он явно не установлен, и (b) document.domain, если явно установлен ... даже если они возвращают одно и то же значение.

Явная установка значения указывает на намерение «сотрудничать» со сценарием в другом поддомене (в том же родительском домене).

Если как родительская страница, так и внешний сценарий явно устанавливают для document.domain одно и то же значение, ограничение политики одного и того же происхождения может быть обойдено, и каждый сценарий может получить доступ ко всем (в противном случае ограниченным) объектам и свойствам контекстов друг друга.

еженедельно
источник
9

На этом сайте я нашел следующую информацию: devguru . Более конкретно, вот цитата:

Это свойство устанавливает или возвращает доменное имя сервера, с которого был создан документ. По умолчанию используется доменное имя сервера, с которого был получен документ, но его можно изменить на суффикс (и только суффикс) этого имени. Это позволяет совместно использовать свойства сценария, обеспечивая безопасность, между документами, доставленными с разных серверов, при условии, что они используют один и тот же суффикс домена.

Мне кажется, что он позволяет межсайтовый скриптинг для одного и того же домена (даже если субдомен другой).

Я бы предположил, что если вы не коснетесь document.domain, движок js разрешит только другие javascripts из того же домена. С этим свойством вы сможете выполнять развертывание в других поддоменах, таких как состояние орбитальных документов.

Мигель Пинг
источник
6
Это не объясняет, почему document.domain = document.domainэто не NOOP.
Crescent Fresh
1
Просто дикая догадка, но, как я уже сказал, я предполагаю, что свойство срабатывает только тогда, когда ему присвоено значение.
Мигель Пинг,
6

document.domainТянет по умолчанию от фактического URL , если явно не установлено. Браузеры будут записывать, если document.domainон был задан по умолчанию из URL-адреса или был явно установлен. Оба должны быть по умолчанию для одного и того же домена, или оба должны быть явно настроены на один и тот же домен, чтобы это работало. Если один по умолчанию, а другой явно установлен, оба совпадают при чтении, двум страницам все равно будет запрещено разговаривать друг с другом.

См. Https://developer.mozilla.org/en-US/docs/DOM/document.domain

Чарли
источник