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

时间:2010-05-24 11:32:54

标签: php python iframe http-headers frame

如何在页面加载期间找到我的页面作为框架嵌入到其他网站?我猜引用请求标题在这里无法帮助我?谢谢。

9 个答案:

答案 0 :(得分:90)

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

此外,一些现代浏览器尊重X-FRAME-OPTIONS标头,它可以有两个值:

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

用户包括Google的Picasa,无法嵌入到相框中。

支持标题的浏览器,版本最低:

  • IE8和IE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9(旧版本NoScript

答案 1 :(得分:39)

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可以被禁用。

答案 2 :(得分:23)

对于modern browsers,您可以使用CSP(内容安全策略),这是一种标准。以下标题将阻止文档在任何位置加载到框架中:

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

(IE 11需要X-前缀)。您还可以将'none'更改为允许框架的来源,例如您自己的网站。

要覆盖旧浏览器,最好与@Maerlyn's answer一起使用。

答案 3 :(得分:13)

您可以使用javascript

阻止在iframe中加载您的网页
<script type="text/javascript">
if ( window.self !== window.top ) {
    window.top.location.href=window.location.href;
}
</script>

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

答案 4 :(得分: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自己。

答案 5 :(得分:2)

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

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

答案 6 :(得分:0)

将 hosname 替换为域名

if (window.top.location.host != "hostname") {
    document.body.innerHTML = "Access Denied";
}

答案 7 :(得分:0)

我在标题顶部使用此 PHP 代码

if($_SERVER['SERVER_NAME'] != 'yourwebsite.com'){
   header('location: yourwebsite.com');
}

如果有人对您的网站进行了 iframe,它将重定向到您的网站

答案 8 :(得分:-1)

<?php
    header("Content-Security-Policy: frame-ancestors 'none'");
?>