Подтвердить что ты не робот

Почему саморегуляторный iframe не бесконечно петляет и разбивает мою машину?

Я создал простую HTML-страницу с iframe, чей атрибут src ссылается на содержащую страницу - другими словами, саморегуляторный iframe.

this.html

<html>
<head></head>
<body>
<iframe src="this.html" />
</body>
</html>

Почему это не бесконечно петляет и разбивает мой браузер? Кроме того, почему даже IE не разбивается об этом?

(Примечание: это вызвало обсуждение команды о достоинствах и недостатках использования iframes для решения проблем. Вы знаете, что это зеркало типа "зеркало".)

4b9b3361

Ответ 1

W3C позаботился об этом в 1997 году, объяснив, как кадры должны быть реализованы в "Реализация HTML-фреймов":

Любой кадр, который пытается назначить в качестве своего SRC URL-адрес, используемый любым из его предков, обрабатывается так, как будто у него нет URL-адреса SRC вообще (в основном пустой кадр).


История ошибок/истории атаки Iframe

Как упоминалось в вышеупомянутом комментарии Kingdago, один браузер, который пропустил реализацию гарантии для этого, был Mozilla в 1999 году. Цитата от одного из разработчиков:

Это ошибка четности (и источник возможного embarrasment), поскольку MSIE5 не имеет проблем с этими типами страниц.

Я решил еще кое-что рассказать об этом, и оказалось, что в 2004 году это произошло снова. Однако на этот раз было задействовано JavaScript:

Это код, что его вызывает: < iframe name= "productcatalog" id = "productcatalog" src= "page2.htm" > </iframe> , за которым следуют a script с этим в нем: frames.productcatalog.location.replace(frames.productcatalog.location + location.hash);

...

Фактические результаты: родительское окно рекурсивно загружается в iframe, что иногда приводит к сбою.

Ожидаемые результаты: просто покажите это как в Internet Explorer.

Затем снова в 2008 году с Firefox 2 (это также связано с JavaScript).

И снова в 2009 году. Интересная часть здесь заключается в том, что эта ошибка все еще открыта, и это приложение: https://bugzilla.mozilla.org/attachment.cgi?id=414035 (вы ограничьте свое любопытство?) все равно будет разбивать/замораживать ваш Firefox (я только что протестировал его, и я почти разбил весь Ubuntu). В Chrome он просто загружается бесконечно (возможно, потому, что каждая вкладка живет в отдельном процессе).


Что касается других браузеров:

  • В 2005 году Konqueror была обнаружена ошибка в том, что позволило отображать iframes один внутри другого (но кажется, что каким-то образом это не замерзло/сбой всего приложения).
  • IE6, Opera 7.54 и Firefox 0.9.3 также сообщили, чтобы быть восприимчивыми к атак на основе рекурсии iframe.

Ответ 2

Я хотел бы добавить кое-что в "Кроме того, почему даже IE не разбивается об этом?" часть вопроса. IE не подведет нас...

Если вы добавите простой номер итерации в строку запроса к вложенному файлу iFrame src Firefox, а другие будут останавливаться после определенной глубины итерации. IE - и мы протестировали это с IE версии 10 - просто сбой:)

this.php

<html>
<head></head>
<body>
<iframe src="this.php?q=<?php echo (isset($_GET['q'])?$_GET['q']:1)+1?>" />
</body>
</html>