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

如何在页面加载过程中发现我的页面是作为框架embedded到其他网站的? 我猜引用者请求标题不能帮助我在这里? 谢谢。

你不能从服务器端检查,但你可以使用JavaScript来检测页面加载后。 比较topself ,如果他们不相同,你在一个框架。

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

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

用户包括Google的Picasa,无法embedded到框架中。

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

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

Stackoverflow包含一些JS来testing它( 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可以被禁用。

对于现代浏览器 ,您可以使用CSP(内容安全策略),这是一个标准。 以下标题将防止文档在任何地方加载到框架中:

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

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

为了覆盖较老的浏览器,最好和@Merlyn的答案一起使用。

你可以防止加载你的网页在JavaScript的iframe

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

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

或者,如果您不介意某些地点的内容,但是不想在某个网站上使用,则可以封锁特定的域名。 例如,如果offendingdomain.comembedded了您的内容,则可以这样做:

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

这将检查父文档的位置,看看它是否embedded您的内容的offendingdomain.com 。 然后,这个脚本将发送该iframe作为一个着名的YouTubevideo作为惩罚。 实际上他们只是Rick-Rolled自己。

通过将下面的脚本放在你的php文件的末尾来检查iframe是否加载到iframe,并redirect到显示警告的页面,或者注意你的页面不应该使用iframe加载。

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

注意:设置元标记是没用的! 例如,没有效果。 不要使用它! 只有像下面的例子那样设置HTTP头,X-Frame-Options才能工作。

https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options