Почему ребенок может перенаправить родительский кадр?

Я рассматриваю эти два вопроса, и я не понимаю.

Перенаправить родительское окно из действия iframe

Как предотвратить перенаправление IFRAME на окно верхнего уровня

С одной стороны, кажется, что вы можете перенаправить родительский iframe, а с другой - не можете? Когда я пытаюсь это сделать, у меня нет проблем с перенаправлением родительского фрейма, поэтому мне интересно, почему все говорят, что вы не можете перенаправить родительский кадр, если вы не находитесь в одном домене. Но я могу перенаправить, не имея фрейма в том же домене.

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

Связано ли это с браузером?

Изменить

У меня есть две страницы, и это работает, но не должно:

В домене 1

<html>
  <body>
    <iframe src="http://domain2.fr"></iframe>
  </body>
</html>

В домене 2

<html>
  <body>
    <script type="text/javascript">
      window.top.location.href = "http://google.fr";
    </script>
  </body>
</html>

Ответ 1

Ответ на вопрос Почему это возможно, совершенно просто. window.location является частью веб-API, который не совсем то же самое, что и ядро ​​JavaScript. Он является частью DOM-интерфейса, следовательно, он вытеснен W3C, а не ECMA. Именно поэтому он позволяет вам управлять свойствами верхнего окна.

Строго говоря, JS не в состоянии это сделать, потому что в нем отсутствуют возможности ввода-вывода, что делает язык чрезвычайно переносимым. Поэтому для реализации браузеров требуется API DOM, для запроса DOM и запроса репликации или взаимодействия с клиентом. Тем не менее DOM нуждается в IO, потому что он отображает и читает фактический пользовательский интерфейс. Некоторые люди в комитете ECMAScript скорее предпочли бы доступ к window.top сильно ограниченным, если не удалить все вместе, для причин уязвимости XSS. К сожалению W3C согласился не согласиться и в любом случае внедрил ссылку window.top.
Кто прав или не прав в этом случае? Я не знаю, легко перенаправить клиента на вредоносный сайт из iFrame, что небезопасно. Но было бы неудобно иметь iFrame, а затем не иметь доступа к верхнему окну, что означало бы неспособность легко взаимодействовать с клиентом. Но это не главное. В нижней строке вы можете изменить некоторые свойства верхнего окна, и это может быть полезно. Просто подумайте о mashups. Они представляют собой множество проблем с точки зрения безопасности XSS, но открывают множество новых и захватывающих возможностей для веб-страниц. Чтобы подключить некоторые из наиболее опасных уязвимостей XSS, взгляните на ADSafe, который был создан Дугласом Крокфордом. У Google есть аналогичная библиотека, но я забыл ее название ATM...

То же самое правило происхождения не применяется здесь. Изменив URL-адрес в адресной строке в окне браузера, вы также измените свойство window.top.location.href. Если бы там были ограничения с одним и тем же происшествием, интернет был бы мертв. Вы не отправляете запрос в другое место, вы не получаете данные от стороннего ресурса и загружаете его на свою страницу, вы перенаправляете браузер в другое место, которое закрывает и очищает DOM.

Ответ 2

Я предполагаю, что по той же причине вы можете сделать следующее:

<a href="http://google.com" target="_top">Redirect top to Google</a>

Я нашел правила для этого поведения здесь: http://www.w3.org/TR/html5/browsers.html#valid-browsing-context-name-or-keyword

Я не мог найти "почему", но лично я нашел полезным перенаправить родителя после того, как кто-то нажал на что-то внутри iframe. Вы можете сначала выполнить асинхронную операцию и проверить что-то перед перенаправлением всей страницы. Поскольку это уже возможно, используя тег <a>, возможно, он был найден соответствующим в JS. Не уверен, почему тег <a> позволяет использовать функциональность.

При этом вы всегда можете предотвратить это поведение, добавив атрибут sandbox="", например: http://jsfiddle.net/ppkzS/1/

Ответ 3

Всякий раз, когда вы используете iframes, frames или objects, вы устанавливаете иерархию окон, причем эти элементы действуют как "окна" в этой иерархии.

Вы можете пересечь эту иерархию со свойствами, такими как .parent, .frameElement и тому подобное. Свойство .top - это окно в самой высокой точке иерархии и обычно соответствует самому внешнему кадру.

Некоторые действия запрещены между окнами в иерархии, другие - нет. Изменение location окна не запрещено.

В конечном счете, люди, которые говорят, что вы не можете сделать это, неверны. То, что вы не можете сделать, - это доступ к содержимому одного окна из другого окна, если их домены отличаются. Однако вы можете изменить их свойства местоположения.

Ответ 4

Если у вас есть два кадра в одном и том же домене (а также один и тот же протокол и порт), тогда один кадр может перенаправить другой туда, где вы хотите, а также получить доступ к свойствам javascript, выполнить функцию из другого фрейма и т.д.

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

Вот некоторая полезная информация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript

Цитата из этой страницы:

Две страницы имеют одинаковое происхождение, если протокол, порт (если один ) и хост одинаковы для обеих страниц.

Очевидно, что frames совпадает с pages.