68

我创建了一个简单的 HTML 页面,iframesrc属性引用了包含页面——换句话说,一个自引用 iframe。

这个.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 发现并在上面的评论中提到的那样,1999年的 Mozilla 是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 对此进行了测试 - 只是崩溃了 :)

这个.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 回答