【问题标题】:How to check if a page is allowed to be iframed?如何检查页面是否允许 iframe?
【发布时间】:2014-10-14 04:56:29
【问题描述】:

我想要做的是动态 iframe 一些页面,所以当用户点击某个按钮时,某个页面(使用按钮动态生成的链接)会在 iframe 中打开。我想跳过那些不允许其内容被 iframed 的网址。

有什么方法可以检查一个 URL 是否限制自己被 iframed?

【问题讨论】:

  • 在浏览器中,您可能会受到限制,但在服务器端您可以检查X-Frame-Options 标头,因为无论如何现在每个人都使用它。

标签: javascript iframe


【解决方案1】:

为 URL 发出 AJAX 请求,检查 x-frame-options 标头。如果是DENYSAMEORIGIN 则可能无法显示。

var xhr = $.get("http://somewhere.com");
xhr.always(function () {
  var frameOption = xhr.getResponseHeader("x-frame-options");
  if (frameOption == "DENY") {
    // etc.
  }
});

https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options

正如 adeneo 指出的那样,对于许多具有跨域策略的站点来说,这可能会失败。最好的办法是在您自己的后端检查 URL。

向您的服务器添加一个路由,该路由接受一个 URL,获取它并检查它是否可以被框住。

【讨论】:

  • 我猜这在跨域网站上根本不起作用?
  • 如果我没记错的话,ajax 不能用于跨域网站?
【解决方案2】:

现在有可靠的方法可以确定 URL 不是 iframeable。

可以通过 Ajax 请求排除大多数这些 URL,并检查响应中的 X-Frame-Options 标头。 (无视“同源政策”)

其他网站使用脚本来检查它们是否是 iframe 的,这些网站只能通过在隐藏的 iframe 中“测试”网站并自己检查内容来排除这些网站,当然这只有在您知道预期内容的情况下才适用,或者至少是一些关键要素。
为防止加载的 iframe 重定向您自己的页面,您可以使用 IFrame-Sandbox 或交替检查 onbeforeunload

【讨论】:

  • Ajax 真的不是一个选项,因为检查页面是否可以框架肯定是跨域的,任何不允许框架的人肯定不会允许跨域调用。隐藏 iframe 也不是一个选项,对于 X-Frame 标头,不会触发任何特殊事件,并且响应仍然是 200,并且大多数帧破坏技术重定向父窗口,因此隐藏 iframe 只会重定向您的页面。
  • 我同意,Ajax 在大多数情况下是没有选择的,但在某些情况下它是,例如iframe 在同一域上构建旧应用程序。隐藏 iframe 选项是可能的,不是很漂亮,但是可能,检查父框架中的 onbeforeunload 和 iframe 中的 onload。
  • HTML5 也可以使用“沙盒”属性。
【解决方案3】:

我认为页面和 iframe 之间没有任何限制。我确实知道该页面可以通过 javascript 检查它是否在 iframe 内。

【讨论】:

  • 除了跨浏览器脚本之外没有任何限制。这意味着您可以从任何站点将任何页面加载到 iframe 中。如果可以的话,由网站来尝试并摆脱 iframe。
  • 你根本没有真正回答这个问题。 OP 询问如何检测网站是否无法加载,例如是否有 X-Frame 标头或帧破坏,这不是很清楚,所以回答 “没有限制” 甚至没有接近答案?
猜你喜欢
  • 2011-11-17
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多