Почему iframe не может установить location.hash своего родителя? - PullRequest
5 голосов
/ 16 июня 2009

У меня есть окно, содержащее iframe, содержащее iframe, вот так:

+---------------+
|      Top      |
| +-----------+ |
| |   Middle  | |
| | +-------+ | |
| | | Inner | | |
| | +-------+ | |
| +-----------+ |
+---------------+

Верх и середина находятся в одном домене, но Inner находится в другом домене. Мне нужен Иннер, чтобы общаться с Топом. Единственный известный мне способ сделать это, который поддерживается в IE7 (который мне нужно поддерживать), - это изменить хэш расположения окна. Тем не менее, я не хочу, чтобы информация мерцала в строке адресации, поэтому я ввел средний iframe.

Я хочу, чтобы Иннер изменил хэш Мидл. Middle прочитает свой хеш и сообщит Top, с кем у него есть разрешение на прямой разговор.

Однако , в Firefox 3 я не смог записать в хэш Мидл из Inner. Ошибка не возникает, но хэш отображается без изменений. Запись в location.href вызывает ошибку прав доступа.

Однако Top может записывать в хэш Middle, а Middle может записывать в хэш Inner, Top может записывать в хэш Inner, а Inner и Middle могут записывать в хэш Top, поэтому только упорядоченная пара это не работает, это то, что я хочу! (Я работал над этим некоторое время.)

Я воспроизвел это в минимальном тестовом примере. Сначала я обслуживал все три страницы из одного домена. Когда я помещаю Inner в другой домен, я получаю проблемное поведение. Когда я ставлю Middle на второй домен, каждый может снова написать каждому.

Почему Иннер не может писать в хэш Мидл?


Приложение : Многие люди полагают, что это невозможно из-за политики одного происхождения. Это именно та политика, которую я пытаюсь обойти. Именно этот случай - установка (но не чтение) местоположения другого окна - должна быть возможной в разных доменах. Я не нашел браузерную документацию на этот счет, но я нашел много статей и демонстраций. По сути, это предшественник HTML 5 postMessage().

Ссылка: http://softwareas.com/cross-domain-communication-with-iframes

Ответы [ 6 ]

7 голосов
/ 03 ноября 2011

Родительские фреймы могут установить детский атрибут iframe 'src' (здесь с jquery), используя:

$("#iframeWindow").attr('src', "http://<CHILD URL>/#hello");

Дочерние iframes могут установить href родительского окна (содержимое адресной строки), используя:

window.top.location.href = "http://<PARENT URL>/#hello"

, а в родительском и / или дочернем элементе необходимо опросить изменения,

var last = "";
setInterval(function() {
    if(last == window.location.href) return;
    last = window.location.href;

    //do stuff with 'window.location.hash'
}, 1000);

заметьте, было бы неплохо, если бы вы могли

window.top.location.href = window.top.location.href + "#hello"

но чтение объекта местоположения (href и hash) не разрешено

проверено 3 ноября 11, на хроме, т.е. 6/7/9, firefox 3.6 / 4

edit1: можно запустить демонстрацию, если люди захотят

edit2: http://dl.dropboxusercontent.com/u/14376395/html/xdomain.html:)

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

edit4: лучшее решение http://ternarylabs.com/2011/03/27/secure-cross-domain-iframe-communication/ в настоящее время используется Google JavaScript API

edit5: доменное имя dropbox изменено на 'dl.dropboxusercontent.com'

1 голос
/ 15 ноября 2009

Похоже, что это ошибка в Firefox, поданная в Bugzilla, согласно EricLaw.

1 голос
/ 16 июня 2009

Чтобы иметь возможность установить location.hash, вы должны сначала получить местоположение. Та же самая политика происхождения запрещает вам получать местоположение.

0 голосов
/ 10 августа 2009

Как сказал Алекс, это проблема безопасности. Вы не можете получить доступ к верхнему слою, если Inner находится в другом домене. Это сделано, чтобы избежать межсайтовых скриптов .

0 голосов
/ 16 июня 2009

Я не могу ответить на вопрос "почему" для хэша, но вы видели, как Джон Резиг работает с postMessage? У вас проблемы с FF3, FF3 является одним из браузеров, которые поддерживают postMessage, бинго: -)

В противном случае есть библиотека xssinterface . Кажется стабильным, но я лично не пробовал.

0 голосов
/ 16 июня 2009

Все ли кадры содержат местоположения с одинаковым происхождением? (например, тот же протокол, тот же домен, тот же порт). Если это не так, то это потенциальная уязвимость безопасности, если один фрейм может изменить другой - Google использует ту же политику происхождения. Но без подробностей сложно дать лучший ответ.

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