防止子 iframe "破坏框架"

15

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

if (top.location != location) {
    top.location.href = document.location.href ;
}
4个回答

25

这是我的第一篇帖子,如果不起作用请不要抨击我,但此修复方法在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>

1
不要对你的答案犹豫不决,如果你不确定自己是否正确,可以查阅资料或让其他人回答。这个网站旨在成为一切事物的权威来源,所以如果你不能绝对正确,那就花些时间仔细检查。这将会带来巨大的回报。 - randomusername
@adigioia 我尝试了你的示例,在 Firefox 和 Chrome 中都可以正常工作。谢谢。 - Jeya Kumar

12

有一种技术可以禁用防止框架被破坏的代码,如在较新的SO问题中所讨论的

实际上,你的框架破解代码也可以被破解如此示例所示

<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 的页面,这不会导致浏览器导航到任何地方

1
我不同意,它确实达到了他的特定目标!目标页面将不会试图打败这种方法,正如问题和评论中所描述的那样。这些新信息现在将使他能够实现他的目标。 - Colin Pickard
1
因此被踩 - 这意味着被接受的答案不再是问题的完整/正确答案。然而,经过进一步思考,我已经撤回了被踩,并用赞替换了它,因为您的答案提供了一个明智的解决方法。 - Colin Pickard
新技术实际上更适合这个目的,因为原始设计包括一个 iframe。 - Colin Pickard
答案未被Jeff接受,因为它们没有解决可能存在多个域的情况。出于实际目的,这个问题仍然没有解决。 - Colin Pickard
1
我已经为你的回答点赞,因为你诚实地说明了发生了什么,并认识到这种情况可能适用于某些情况。这似乎是一种拼命的技巧,但确实有效。老实说,我希望有一天会出现更好的解决方案(比如“无框架”属性),因为大多数阻止框架破坏的行为都属于“犯规”范畴。如果有人不想被框架包含,允许他们在新窗口中打开是“正确”的事情。我们的保险产品被设计成可以被框架包含,包括与父网站匹配的CSS:没有阻止框架破坏的代码。 - Godeke
1
这段代码对某些需求很有用,但不适用于此问题。我也遇到了这个问题。我尝试了解决方案,但 iframe 仍然跳转到主 URL。但是,如果我在包含此脚本的页面上单击我的主页链接,它会返回到该页面。这是一个好的解决方案,但并没有解决这个问题。 - aiternal

6
一个很重要的问题,我希望更多人认真对待它,而不是仅仅回复一些关于“尊重”那些被链接材料愿望的无聊评论。那么,我们该如何尊重那些被窃取的流量和防止框架破坏的JavaScript脚本呢?
在网络礼仪中,防止框架破坏的脚本实际上是一个大忌讳,因为这正是导致流量被盗的原因之一。使用框架或iframe有许多合理、无辜的理由。而且,代码(尤其是URL)很容易被合法或非法地插入到框架页面中,从而将流量有意或无意地引导到另一个页面,然后粗鲁地打破框架并窃取流量。
对于那些不希望自己的材料被显示在框架中的网站管理员来说,正确的网络礼仪方法是制作一个重定向脚本,将浏览者引导到一个顶级页面,显示一条消息,告知浏览者请求的页面不应在框架中查看。如果他们想查看该页面,则可以在新标签页或浏览器页面中打开一个链接的URL,这不会破坏框架并窃取原始网站的流量,从而允许浏览者自己选择他们想要浏览的内容。
我希望更多的网站管理员能够尊重这样的网络礼仪。

5

在经过了大量搜索之后,我想到了一个简单的方法。我在自己的网站上创建了一个虚拟页面,然后通过 i frame 调用它。接着,在虚拟页面中添加了一个 i frame,用于调用需要打破框架限制的网站。这样就可以顺利地跳出第一个框架,而由于虚拟页面是在我的网站上,所以它仍旧保持在顶层页面的框架内。即可实现这个技巧。


这真的是“思维定势” :-) 即使在我的使用情况下(IE),它也应该能够工作,谢谢! - Giovanni P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接