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

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

document.domain = document.domain;

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

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


person mjs    schedule 26.09.2009    source источник


Ответы (4)


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

При попытке выполнить комету между субдоменами и портами, 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), а затем все совпадает, и связь между портами и субдоменами работает.

person Michael Carter    schedule 06.10.2009
comment
К сожалению, это решение у меня не сработало (см. Заголовок stackoverflow.com/questions/7796767/ для подробностей). Добавление «document.domain = document.domain» во все фреймы не меняет поведения Chrome. Любые идеи? - person Stephen Gross; 17.10.2011
comment
Кроме того, я понял, что если я установлю задержку для своих js, я, по крайней мере, получу корректно выглядящие URL-адреса для обоих фреймов. Тем не менее, один кадр не может получить доступ к другому. - person Stephen Gross; 17.10.2011
comment
Есть еще одно объяснение того, как странный скрытый порт работает в MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript - person mjs; 09.03.2012
comment
Ах, значит, вы виноваты в этом бешеном фрагменте кода. Благодаря этой строке после ее запуска (и установки document.domain) любой динамически созданный iframe устанавливается как междоменный, и, таким образом, вновь созданный iframe больше не может быть доступен. : / - person crappish; 05.07.2013
comment
@mjs yes: Номер порта хранится браузером отдельно. Любой вызов установщика, включая document.domain = document.domain, приводит к перезаписи номера порта нулевым значением. Следовательно, нельзя заставить company.com:8080 взаимодействовать с company.com, установив в первую очередь document.domain = company.com. Он должен быть установлен в обоих так, чтобы оба номера порта были нулевыми. - person Royi Namir; 19.10.2013
comment
Обратите внимание, что поскольку fxsitecompat.com/en-CA/docs/2013/ вы должны поместить document.domain = document.domain в блок try-catch. - person Mikko Rantalainen; 12.05.2017

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

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

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

person cweekly    schedule 20.10.2010

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

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

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

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

person Miguel Ping    schedule 26.09.2009
comment
Это не объясняет, почему document.domain = document.domain не NOOP. - person Crescent Fresh; 27.09.2009
comment
Просто дикая догадка, но, как я уже сказал, я предполагаю, что свойство запускается только тогда, когда ему присвоено значение. - person Miguel Ping; 27.09.2009

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

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

person Charlie    schedule 24.04.2013