JavaScript document.domain Uncaught DOMException: заблокирован фрейм с источником - PullRequest
0 голосов
/ 26 февраля 2019

Пока я тестировал SOP, я пришел к такому сценарию: два документа связаны с одним и тем же доменом, как я и ожидал, и он выдает ошибку, когда я пытаюсь получить местоположение.

Чтобы воспроизвести проблему:

  1. Откройте https://www.google.com
  2. с консоли let opened = window.open("https://www.google.com")
  3. из того же окна, выполните opened.location.toString()который вернет правильное местоположение
  4. из консоли второй вкладки, сделайте document.domain = "www.google.com"
  5. из первой вкладки, сделайте opened.location.toString(), и вы получите ошибку

    Uncaught DOMException: Blocked a frame with origin "https://www.google.com" from accessing a cross-origin frame.
    at <anonymous>:1:12
    

Кто-нибудь может объяснить это странное поведение?

Ответы [ 3 ]

0 голосов
/ 30 марта 2019

Эта ошибка не является ошибкой.Политика того же происхождения - это механизм безопасности, который гарантирует, что оконные объекты имеют доступ только к той информации, которую им разрешено получать.В вашем случае это включает в себя доступ к opened.location.

. После создания обе вкладки имеют одинаковое происхождение, что позволяет первой получить доступ к opened.location.Но после звонка на document.domain='www.google.com' они больше не нужны.

«Что? Но на обеих вкладках window.location.origin идентичны»

Да, ноэто немного сложнее.Источник определяется схемой / хостом / портом, подробности см. В ответе @ TheUnknown.Схема и хост остаются неизменными, и они включены в строку window.location.origin.

Хитрость, которую нужно знать, - это любой вызов document.domain, включая document.domain = document.domain вызывает перезапись номера порта на null, что приводит к различию в происхождении двух вкладок и не позволяет им передавать информацию, такую ​​как opened.location, друг с другом, что приводит к ошибке.

Информация, извлеченная из руководства MDN по политике того же происхождения

0 голосов
/ 04 апреля 2019

Это будет немного неинформативно (только констатирует факты), тем не менее:

  • После изменения domain в окне B окно B останавливает учетное окно A как opener.

  • Поскольку окно A больше не считается открывателем окна B, доступ запрещен.

Это заставляет меня думать, что изменение document.domain считается потенциально небезопасным и "наказывается", осиротев дочернее окно.

0 голосов
/ 29 марта 2019

Во-первых, я бы порекомендовал вам прочитать Политика одного и того же происхождения .

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

Два URL имеют одинаковое происхождение, если протокол , порт (если указан) и хост одинаковы для обоих.Вы можете увидеть это как «схема / хост / порт кортеж» или просто «кортеж».(«Кортеж» - это набор элементов, которые вместе составляют единое целое - общая форма для двойного / тройного / четверного / пятого / и т. Д.)

В этом конкретном случае вы открываете окно с HTTPS протокол, однако при настройке домена протокол изменяется на HTTP , см. Изображение ниже:

protocol has changed

Согласно 1 , если протоколы не совпадают, это является нарушением принципа и, следовательно, вы получаете ошибку

Uncaught DOMException: заблокирован фрейм с источником "https://www.google.com" от доступа к кросс-источнику фрейму.

кросс-источнику является ключевым словом здесь.

Кроме того, проверьте это SecurityError: Для получения дополнительной информации заблокирован фрейм с источником из-за доступа к фрейму перекрестного происхождения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...