Що робить document.domain = document.domain?


90

Клієнтський компонент JS Orbited (сервер Comet) вимагає, щоб, якщо сервер працює в іншому домені або порту, який відрізняється від самого JS, ви повинні виконати

document.domain = document.domain;

перед завантаженням будь-якого іншого JS. (Див. Документацію .)

Що це робить? Це схоже на НООП! (Я перевірив, і це насправді потрібно.)

Відповіді:


203

Я насправді написав цей код.

При спробі зробити крос-субдомен / порт комети, 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. Будь-які ідеї?
Stephen Gross

Крім того, я зрозумів, що якщо я встановлюю затримку для свого js, я принаймні отримую дійсні URL-адреси для обох кадрів. Однак, проте, один кадр не може отримати доступ до іншого.
Стівен Гросс,

6
Існує ще одне пояснення того, як дивний "прихований" порт працює на MDN: developer.mozilla.org/en/Same_origin_policy_for_JavaScript
mjs

1
А, отже, ти є винуватцем цієї неприємної шматочки коду. Завдяки зазначеному рядку, після його запуску (і набору document.domain) будь-який динамічно створений iframe встановлюється як міждоменний, і тому новостворений iframe більше не доступний. : /
дерьмовий

@mjs так: Номер порту зберігається браузером окремо. Будь-який виклик установнику, включаючи document.domain = document.domain, призводить до того, що номер порту буде замінено на null. Тому неможливо змусити company.com:8080 розмовляти з company.com, лише встановивши document.domain = "company.com" у першому. Він повинен бути встановлений в обох, щоб номери портів були нульовими.
Рої Намір,

38

Браузери розрізняють (a) 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.