防止子 iframe “跳出框架”

Posted

技术标签:

【中文标题】防止子 iframe “跳出框架”【英文标题】:Preventing child iframe from "breaking out of frame" 【发布时间】:2010-10-19 15:26:19 【问题描述】:

我正在做一些简单的网络集成工作,我通过使用 iframe 来完成。我的主窗口有一些 javascript 与我的服务器交互以将 iframe 重定向到所需的 URL。遗憾的是,其中一个目标页面内部包含以下代码:

if (top.location != location) 
    top.location.href = document.location.href ;

脚本由于跨站点脚本限制而终止,并阻止该页面正确呈现。我无法修改该页面的来源(我正在与之集成的第 3 方)。

我该如何解决这个问题?

谢谢

【问题讨论】:

【参考方案1】:

这是我的第一篇文章,所以如果它不起作用,请不要把我扔掉,但这个修复似乎在 IE 中对我有用。 将 security="restricted" 添加到您的框架中。

示例:

<iframe id="frame_id" name="frame_name" security="restricted" src="page.html">  
</iframe>

编辑:我找到了更好的解决方案。这不会阻止脚本,也不需要 javascript。尝试使用 sandbox="..."

allow-forms 允许提交表单 allow-popups 允许弹出窗口 allow-pointer-lock 允许指针锁定 allow-same-origin 允许文档保持其来源 allow-scripts 允许 JavaScript 执行,也允许特性自动触发 allow-top-navigation 允许文档通过导航***窗口来跳出框架

顶部导航是您想要阻止的,因此将其排除在外,这样就不会被允许。任何遗漏的内容都会被屏蔽

例如。

<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"></iframe>

【讨论】:

不要对自己的答案犹豫不决,如果您不确定自己是否正确,请查看或让其他人回答。该站点旨在成为所有内容的权威来源,因此,如果您不能绝对正确,请花点时间仔细检查。它会带来巨大的回报。 @adigioia 我试过你的例子,它在 ff 和 chrome 中都可以正常工作。谢谢【参考方案2】:

有一种技术可以禁用帧破坏代码,as discussed in a newer SO question:

事实证明,你的框架破坏代码可以被破坏,as shown here:

<script type="text/javascript">
    var prevent_bust = 0  
    window.onbeforeunload = function()  prevent_bust++   
    setInterval(function()   
      if (prevent_bust > 0)   
        prevent_bust -= 2  
        window.top.location = 'http://server-which-responds-with-204.com'  
        
    , 1)  
</script>

此代码执行以下操作:

每次浏览器通过window.onbeforeonload 事件处理程序尝试离开当前页面时,计数器都会增加一个 通过setInterval() 设置每毫秒触发一次的计时器,如果发现计数器增加,则将当前位置更改为攻击者控制的服务器 该服务器提供一个带有 HTTP 状态代码 204 的页面,这不会导致浏览器在任何地方导航

【讨论】:

我不同意;它确实达到了他的特定目标!如问题和 cmets 中所述,目标页面不会尝试破坏此方法。现在,这些新信息将使他能够实现自己的目标 因此投反对票 - 旨在表明接受的答案不再是对该问题的完整/正确答案。然而,经过进一步考虑,我撤回了被否决的投票并用赞成票取而代之,因为您的回答确实提供了一个明智的解决方法。 这项新技术实际上更适合这个目的,因为最初的设计包括一个 iframe。 我赞成您的回答,因为至少对所发生的事情诚实,并认识到在某些情况下可能适用。这似乎是一种绝望的技术,但它确实有效。老实说,我希望有一天会有更好的东西(比如“NoFrame”属性)发挥作用,因为大多数对帧破坏的抑制属于“犯规”类别。如果有人不想被陷害,让他们拥有一个新窗口是“正确”的事情。我们的保险产品设计为框架,包括与父网站匹配的 CSS:那里没有框架破坏代码。 此代码对某些需求有用,但不适用于此问题。我也有这个问题。我尝试了解决方案,但 iframe 仍然输出到主 url。但是,如果我在此脚本所在的页面上单击我的主页链接,它会返回到该页面。很好的解决方案,但不能解决这个问题。【参考方案3】:

经过大量搜索,我开发了一个简单的技巧。我在自己的站点中创建了一个虚拟页面,该页面需要 i 框架。然后我在虚拟页面中有一个 i 框架,它要求网站打破框架。它突破了第一帧,但由于虚拟页面在我的网站上,它整齐地留在首页的框架中。中提琴

【讨论】:

这真的是“在盒子里思考” :-) 即使在我的用例 (IE) 中它也应该可以工作,谢谢!【参考方案4】:

一个有效的问题,我希望更多的人认真对待,而不是仅仅用蹩脚的cmet回答“尊重”那些材料被链接的人的意愿,有时是无意的。

尊重流量怎么样,框架破坏 javascript 窃取?

出于网络礼仪的原因,框架破坏脚本实际上是一个很大的禁忌。

使用框架或 iframe 有许多真正且无害的原因,而且将代码(尤其是 url)合法或非法地插入到该框架集中的页面中不仅非常容易,而且非常普遍,故意或以其他方式将流量引导到另一个页面,然后粗鲁地破坏框架集并窃取流量。

对于不希望自己的材料显示在框架集中的网站管理员,无论是有意还是无意,正确使用的网络礼节方法是制作重定向脚本到首页,显示一条消息,通知冲浪者所请求的页面不打算在框架中查看,如果他们希望查看该页面,那么他们可以在一个 url 上查看它,然后链接,以在新选项卡或浏览器页面中打开,这不会破坏框架集,并窃取原始网站的流量,从而允许冲浪者自己选择他们实际希望冲浪的地方。

希望更多的站长尊重这样的网络礼仪。

【讨论】:

以上是关于防止子 iframe “跳出框架”的主要内容,如果未能解决你的问题,请参考以下文章

如何让jqueryEasyUI里面的dialog弹出层跳出iframe框架在最外层显示以防止拖动时部门被遮住之后无法拖动

如何防止 iframe 访问父框架?

框架破坏,但如果是我的话

如何让EasyUI弹出层跳出框架

如何让EasyUI弹出层跳出框架 WEB开发分享

selenium - iframe子框架