web-dev-qa-db-ja.com

自己参照iframeが無限にループせず、マシンがクラッシュしないのはなぜですか?

iframeを使用して単純なHTMLページを作成しました。そのsrc属性は、含まれているページを参照します。つまり、自己参照iframeです。

this.html

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

なぜこれが無限にループしてブラウザがクラッシュしないのですか?また、なぜIEこれでクラッシュしないのですか?

(注:これは、iframeを使用して問題を解決することのメリットとデメリットに関するチームディスカッションから生まれました。「ミラーのミラー」のようなものです。)

52
kingdango

W3Cは1997年に、 " Implementing HTML Frames "でフレームを実装する方法を説明しました。

祖先のいずれかが使用しているURLをSRCとして割り当てようとするフレームは、SRC URLがまったくないかのように扱われます(基本的には空白のフレーム)。


Iframe再帰バグ/攻撃履歴

キングダゴが発見し、上記のコメントで述べたように、これに対するセーフガードの実装に失敗したブラウザは、Mozillain1999でした。開発者の一人からの引用:

MSIE5はこれらの種類のページには問題がないので、これはパリティのバグ(および考えられる問題の原因)です。

私はこれをさらに掘り下げることに決めました、そして、それは2004でこれが起こったことが判明しました 再び 。ただし、今回はJavaScriptが関係しました。

これがコードで、その原因は次のとおりです。<iframe name = "productcatalog" id = "productcatalog" src = "page2.htm"> </ iframe>の直後に、次のコードを含むスクリプトが続きます。frames.productcatalog.location.replace (frames.productcatalog.location + location.hash);

...

実際の結果:親ウィンドウがiframeに再帰的に読み込まれ、クラッシュすることがあります。

期待される結果:Internet Explorerのように表示するだけです。

次に again in2008withFirefox 2(これにはJavaScriptも含まれます) 。

そして again in2009。ここで興味深いのは、このバグがまだ開いていることであり、この添付ファイル:https://bugzilla.mozilla.org/attachment.cgi?id=414035(好奇心を抑えますか?)は引き続きクラッシュします/ Firefoxをフリーズします(テストしたばかりで、Ubuntu全体がほぼクラッシュしました)。 Chromeでは、無期限に読み込まれるだけです(おそらく、各タブが個別のプロセスに存在するためです)。


他のブラウザに関しては:

  • 2005Konqueror には、iframeのレンダリングを許可する保護機能にバグがありました 別の内部にある (しかし、どういうわけかアプリ全体をフリーズ/クラッシュさせませんでした)。
  • IE6、Opera 7.54およびFirefox 0.9.3も 報告されている iframe再帰に基づく攻撃の影響を受けやすい。
76
Konrad Dzwinel

「また、なぜ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>
32
C.O.