如何防止通过iFrame的第三方网站框架加载我的网站页面


81

在页面加载期间,如何确定我的页面作为框架嵌入到其他站点?我想引荐来源请求标头在这里帮不上忙吗?谢谢。


嗨,约翰,我不能在这里说我需要完整的解决方案,只需移动方向就可以了,在我找到问题的答案之后,我总是将其发布为答案,这是我参与社区活动的唯一方式。
10年

注意:设置meta标签是没有用的!例如,<meta http-equiv =“ X-Frame-Options” content =“ deny”>无效。不要使用它!只有通过设置HTTP标头(如以下示例),X-Frame-Options才能起作用。developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options
Hosam Elzagh,

Answers:


100

您不能从服务器端检查它,但是可以在页面加载后使用javascript进行检测。比较topself,如果它们不相同,则表示您处于框架中。

此外,某些现代浏览器会使用X-FRAME-OPTIONS标头,该标头可以具有两个值:

  • DENY –如果页面包含在框架中,则阻止呈现页面
  • SAMEORIGIN –与上面相同,除非页面与顶级框架集所有者属于同一域。

用户包括无法嵌入框架的Google Picasa。

支持标头(最低版本)的浏览器:

  • IE8和IE9
  • 歌剧10.50
  • Safari 4
  • 铬4.1.249.1042
  • Firefox 3.6.9(带有NoScript的旧版本)

2
由于我通过谷歌搜索跌跌撞撞这里,我要补充的是火狐加入2010年8月,X-FRAME-OPTIONS与FF3.6.9: michael-coates.blogspot.com/2010/08/...
ThePants


43

Stackoverflow包含一些JS来对其进行测试(master.js)。这是其中的相关部分:

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

但是请记住,可以禁用JS。


如果您想向正在将内容放入iframe的人或正在iframe中查看您内容的网站的最终用户发送消息,则此方法特别有用。
kevinmicke '17

29

对于现代浏览器,您可以使用标准的CSP(内容安全策略)。以下标头将阻止文档在任何位置的框架中加载:

Content-Security-Policy: frame-ancestors 'none'

(不过,IE 11需要X-前缀)。您也可以更改'none'为允许成帧的来源,例如您自己的站点。

为了覆盖较旧的浏览器,最好将其与@Maerlyn的答案一起使用。


1
所有适当的尊重,您的答案还不够清楚。这是标头代码还是PHP?例如。
加里·卡莱尔·库克

2
@GaryCarlyleCook这是一个HTTP标头,在提供页面时应作为对浏览器的响应的一部分。它不是PHP代码,尽管您可以使用PHP发送它。参见header()
rvighne,2016年

15

您可以使用javascript阻止将页面加载到iframe中

<script type="text/javascript">
if ( window.self !== window.top ) {
    window.top.location.href=window.location.href;
}
</script>

此代码将页面的iframe容器的地址更改为页面地址,并强制容器显示您的页面。


1
sandboxiframe上的属性允许禁止此类成帧的转义黑客。因此,如果您担心安全问题,则这种方法不是防止成帧的安全方法。
弗雷德里克

6

或者,如果您不介意某些地方的内容但又不想在某个站点上访问,则可以屏蔽特定的域。例如,如果offendingdomain.com要嵌入您的内容,则可以执行以下操作:

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

这将检查父文档的位置,并查看是否offendingdomain.com嵌入了您的内容。然后,该脚本会将该iframe发送到某个著名的youtube视频作为惩罚。实际上,他们只是Rick-Rolled。


3

通过将以下脚本放在php文件的末尾,并使用javascript来检查它是否已加载到iframe上,并重定向到显示警告或注意您的页面不应该使用iframe加载的页面。

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.