我创建了一个简单的HTML页面,其属性引用了包含页面 - 换句话说,一个自引用的iframe。iframe
src
这.html
<html>
<head></head>
<body>
<iframe src="this.html"></iframe>
</body>
</html>
为什么这不会无限循环并崩溃我的浏览器?另外,为什么连IE都没有崩溃?
(注意:这源于团队关于使用 iframe 解决问题的优点和缺点的讨论。你知道,“镜子中的镜子”类型。
W3C 在 1997 年解决了这个问题,解释了如何在“实现 HTML 框架”中实现框架:
任何想将任何祖先使用的 URL 分配为其 SRC 的帧都将被视为根本没有 SRC URL(基本上是空白帧)。
正如Kingdago在上面的评论中发现并提到的那样,一个错过了为此实施保护措施的浏览器是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
至于其他浏览器:
你是一个了不起的人@Konrad
谢谢@kingdango。这是一个很好的问题,我最终对“iframe 递归错误/攻击”历史进行了研究,请查看我更新的答案。
@Konrad正如我在下面的回答中所说明的那样,iframe递归攻击今天在所有版本的IE中仍然可能 - 也就是说,如果可以利用我发现的通用崩溃。
你也可以在现代浏览器中创建这种行为——它只需要JavaScript:例如
frame.src = 'http://0.0.0.0:9922/index.html?' + new Date().getTime()