68

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

this.html

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

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

(注:これは、問題を解決するためにiframeを使用することの長所と短所に関するチームディスカッションから生まれました。ご存知のとおり、「ミラーのミラー」のようなものです。)

4

3 に答える 3

89

W3C は 1997 年に「HTML フレームの実装」でフレームを実装する方法を説明しました。

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


iframe 再帰バグ/攻撃履歴

kingdago が発見し、上記のコメントで述べたように、これに対するセーフガードを実装できなかったブラウザの 1 つが1999 年のMozillaでした。開発者の一人からの引用:

MSIE5 ではこの種のページに問題がないため、これはパリティ バグです (また、困惑の原因となる可能性があります)。

私はこれをさらに掘り下げてみることにしましたが、2004 年にこれが再び起こったことが判明しました。ただし、今回はJavaScriptが関与していました。

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

...

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

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

その後、2008 年Firefox 2で再び(これには JavaScript も関係していました)。

そして2009年再び。ここで興味深いのは、このバグがまだ未解決であり、この添付ファイル: (あなたの好奇心を抑えますか?) は依然として Firefox をクラッシュ/フリーズさせることです (テストしたところ、Ubuntu 全体がほとんどクラッシュしました)。Chrome では、無期限に読み込まれます (おそらく、各タブが別々のプロセスに存在するためです)。https://bugzilla.mozilla.org/attachment.cgi?id=414035


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

  • 2005年、 Konquerorのセーフガードにバグがあり、iframeを別のフレーム内にレンダリングできました(ただし、アプリ全体がフリーズ/クラッシュすることはなかったようです)。
  • IE6、Opera 7.54、および Firefox 0.9.3 も、iframe 再帰に基づく攻撃を受けやすいことが報告されています。
于 2013-01-08T20:54:52.033 に答える
41

「また、これで 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>
于 2013-05-04T14:21:17.620 に答える
0

IE 6.0 はスクリプトなしでクラッシュする可能性があります:

<iframe src="this.html?c=9"></iframe>

これがループ検出をトリガーしない理由や、変更されているかどうかはわかりません。

于 2022-01-06T16:31:53.123 に答える