Ошибка Firefox установки родительского местоположения в кросс-домене JavaScript - PullRequest
10 голосов
/ 21 июля 2009

Вот случай:
страница A содержит iframe B, B содержит iframe C, A и B находятся в одном домене, C - в другом.
C пытается сбросить местоположение родительского B с дополнительной информацией, следующей за «#», для решения междоменной связи с использованием Fragment Id Messaging.

IE6 / 7/8 просто отлично работает в этом случае, в то время как Firefox блокирует parent.location с сообщением об ошибке [ Доступ к свойству запрещен "код:" 1010 ]. Но если B - верхнее окно, то есть A нет, Firefox тоже живет.

Мне странно ... Не могли бы вы, ребята, помочь?

Спасибо!

Ответы [ 2 ]

15 голосов
/ 21 июля 2009

Исторически, любое окно могло изменить местоположение любого другого окна. Это оказалось проблемой, потому что, среди прочего, это означало, что встраивание логара iframe в окно было небезопасным (потому что тогда злонамеренный сайт мог заменить логин iframe поддельной версией). Со временем были применены дополнительные ограничения к изменениям местоположения в окнах браузера до тех пор, пока HTML5 и большинство браузеров не достигли общего соглашения по политике предков . В двух словах, перефразируя спецификацию HTML5, окно A может изменить местоположение другого окна B, если:

  • местоположения A и B имеют одинаковое происхождение, то есть они имеют одинаковую схему, хост и порт (например, http, stackoverflow.com, 80) или
  • B - это окно верхнего уровня, а A - это окно во фрейме, вложенном на некоторой глубине в B (прямой потомок, потомок дочернего элемента и т. Д.), Или
  • B - это окно, открытое с использованием window.open, и A может изменить местоположение окна, открывшего B (таким образом, B - это всплывающее окно, открытое с помощью A, с помощью всплывающего окна, открываемого с помощью A, или с большей глубиной), или
  • B не является окном верхнего уровня, но его родительским окном или родительским окном его родителя, или при некотором аналогичном происхождении местоположения этого окна и A имеют одинаковое происхождение

(То же происхождение сложнее, чем это, но приведенное выше описание улавливает его сущность и охватывает наиболее распространенные случаи.)

В соответствии с этой политикой C может изменить местоположение A, а A может изменить местоположение B или C, но C не может изменить местоположение B. Если вам нужно обойти это, вам следует изменить свою страницу Местоположение A к чему-то, что изменяет B соответственно; поочередно, вы можете попросить вашу страницу B изменить свое местоположение .

Надеюсь, это информативно, если не обязательно полезно. Модель безопасности браузера была не столько разработана , сколько эволюционировала , и только с недавней работой в HTML5 она действительно была точно зафиксирована для устранения этих кросс-браузерных несоответствий.

Все это говорит о том, что я удивлен тем, что IE7 и IE8 работают на вас - это было мое понимание, что вышеупомянутая политика была основана главным образом на политике, реализованной в IE7.

0 голосов
/ 21 июля 2009

Из C вы можете получить доступ к окну B, используя window.top.

Попробуйте, var B = window.top; B.location = "...";

...