检查网站是不是不允许嵌入 iframe

Posted

技术标签:

【中文标题】检查网站是不是不允许嵌入 iframe【英文标题】:Checking if a website doesn't permit iframe embed检查网站是否不允许嵌入 iframe 【发布时间】:2011-11-17 08:22:18 【问题描述】:

我正在为我的应用程序编写一个类似灯箱的简单插件,我需要嵌入一个链接到任意页面的 iframe。问题是,许多网站(例如,facebook、nytimes 甚至 ***)会检查是否被嵌入到框架中,如果是,则会以自身作为父页面来刷新页面。这是一个已知问题,我认为对此无能为力。但是,我希望能够事先知道网站是否支持嵌入。如果没有,我想在新选项卡/窗口中打开页面,而不是使用 iframe。

有没有什么技巧可以让我在 javascript 中检查这个?

也许有一个服务器端脚本可以检查链接以查看它们是否允许嵌入 iframe?

我正在开发一个浏览器扩展程序,因此有机会做一些非常有创意的事情。我的扩展加载在每个页面上,所以我认为有一种方法可以在 iframe url 中传递一个参数,如果它破坏 iframe,扩展可以获取该参数。然后我可以将该域添加到不支持 iframe 嵌入的站点列表中。这可能会起作用,因为扩展未在 iframe 中加载。我会努力解决这个问题,但与此同时......

澄清:

我愿意接受没有办法“破坏”“框架破坏者”,即我知道我无法在 iframe 中显示不想在一个 iframe 中的页面。但我希望我的应用程序能够优雅地失败,这意味着如果不支持 iframe 嵌入,则在新窗口中打开链接。理想情况下,我想在运行时检查 iframe 嵌入支持(javascript),但我可以看到使用上面 cmets 中建议的代理的潜在服务器端解决方案。希望我可以建立一个不允许嵌入 iframe 的网站数据库。

【问题讨论】:

我认为你运气不好,除非你代理页面并寻找顶部。或父母。 你能解释一下你所说的代理页面是什么意思吗?谢谢 您可以抓取您想要嵌入服务器的页面并扫描“top.”、“parent.”、“_top”和“_parent”,但它们没有这样做是有原因的想被陷害。 @mplungjan 你能指定我可以通过扫描顶部、父级等来做什么吗?我想我可以通过我的 iframe url 抓取页面,例如 mydomain.com/frame.php?url=facebook.com 并检查它是否返回我包含的 iframe .....但我也不认为这会起作用,因为显然我们不是在渲染页面,只是抓取 html。所以,当然我的 iframe html 会在那里。 不,你需要获取 FOREIGN html 并扫描它 【参考方案1】:

使用以下代码检查 x-frame-options 标头

$url = "http://***.com";
$header = get_headers($url, 1);
echo $header["X-Frame-Options"];

如果返回值 DENY、SAMEORIGIN 或 ALLOW-FROM,那么您不能将 iframe 与该 url 一起使用。

【讨论】:

【参考方案2】:

可能很晚,但您需要做的是发出请求,可能来自您的服务器并查找 x-frame-options 标头。如果它完全存在,您可以打开一个新选项卡,因为如果存在,则为以下选项之一:拒绝、SAMEORIGIN、ALLOW-FROM。在任何这些情况下,您都可能无权在 iframe 中打开它。

【讨论】:

【参考方案3】:

这个话题已经在网络上永远讨论过了,这里有一个特别有趣(失败)的尝试:

Frame Buster Buster ... buster code needed

最重要的是,即使您能够构建一个代理来解析您的 iframe 中所需的页面内容并在将违规代码提供给 iframe 之前将其删除,您仍然可能会遇到“停止并如果他们听说您这样做,请停止”。

如果您不希望您的开发被广泛使用,您可能会侥幸成功。如果您希望您的开发变得流行,请忘记它,并建立一种不那么卑鄙的方式来处理它。

或者只为移动设备开发它... ;)

更新:好的,从您的评论开始,这里有一点点品尝:

在javascript中捕获链接的点击

$("a").click(function(e)

    preventDefault(e); // make sure the click doesn't happen

    // call a server side script using ajax and pass the URL this.href
    // return either a true or false; true = iframe breakout
    // set the target attribute of the link to "_blank" for new window (if true)
    // set the target attribute of the link to "yourframename" for iframe (if false)
    // only now load the page in the new window or iframe
);

PHP 中的服务器端

$d = file_get_contents($url); // $url is the url your sent from the browser
// now parse $d to find .top .parent etc... in the <head></head> block
// return true or false 

【讨论】:

很好的参考,但这并没有完成问题。请参阅我上面的编辑。谢谢 我开始明白了。谢谢 :) 你能解释一下我为什么要在文档中寻找 .top 或 .parent 吗?如果其中一个匹配,那么他们是否嵌入了一些破坏框架的js?如果是这样,他们包含外部脚本的情况如何? 这就是你甚至不想开始考虑打破框架破坏的原因。 同意@mplungjan,包含相关代码的可能性很多,不值得尝试找到它。只需做 facebook 所做的事情并让您的客户更改创建他们的页面以与您的网站一起使用。如果您查看拒绝被框架的页面的源代码(例如这个),您可以看到代码在工作。通常它会说如果这个窗口不是顶部或父窗口然后让它如此。 很公平。我真的不想打破框架破坏,因为我知道这几乎是不可能的。但我确实认为必须有某种方法能够检查一个站点是否是框架破坏者,然后将这个列表存储起来。感谢您的建议开始

以上是关于检查网站是不是不允许嵌入 iframe的主要内容,如果未能解决你的问题,请参考以下文章

Grafana Cloud - 匿名访问 - 嵌入 iframe

嵌入的 YouTube 视频在 iframe HTML 中不可用

验证/允许 YouTube 嵌入代码

仅在特定域上加载 iframe

iframe只在本地显示,上传到服务器就不显示了?

如何检查嵌入了 javascript 徽章的网站?