为什么自引用iframe不能无限循环并使我的机器崩溃?

kin*_*ngo 51 html iframe firefox internet-explorer google-chrome

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

this.html

<html>
<head></head>
<body>
<iframe src="this.html"></iframe>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

为什么这不会无限循环并崩溃我的浏览器?另外,为什么连IE都不会崩溃?

(注意:这是由团队讨论使用iframe解决问题的优点和缺点产生的.你知道,'镜像镜像'排序.)

Kon*_*nel 76

W3C在1997年解决了这个问题,解释了如何在" 实现HTML框架 "中实现框架:

尝试将其任何祖先使用的URL指定为其SRC的任何帧都被视为根本没有SRC URL(基本上是空白帧).


iframe递归bug /攻击历史

作为kingdago发现了,在上面的评论中提及,错过实现此一保障一个浏览器是Mozilla的1999年.引用其中一位开发人员:

这是一个奇偶校验错误(以及可能的尴尬的来源),因为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年.这里有趣的部分是这个bug 仍然开放的,这个附件:( https://bugzilla.mozilla.org/attachment.cgi?id=414035你会抑制你的好奇吗?)仍然会崩溃/冻结你的Firefox(我刚测试它,我几乎崩溃了整个Ubuntu).在Chrome中,它只是无限加载(可能是因为每个标签位于一个单独的进程中).


至于其他浏览器:

  • 2005年, Konqueror在它的安全措施中有一个错误,允许将iframe渲染到另一个内部(但似乎它不会冻结/崩溃整个应用程序).
  • 据报道,IE6,Opera 7.54和Firefox 0.9.3也容易受到基于iframe递归的攻击.

  • 您也可以在现代浏览器中创建此行为 - 它只需要JavaScript:例如`frame.src ='http:/ 0.0.0.0:9922/index.html?' + new Date().getTime()` (2认同)

C.O*_*.O. 32

我想在"另外,为什么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>
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你内心的人让你测试这个. (25认同)