如何防止我的网站页面被加载到其他网站的 iframe 中?

Posted

技术标签:

【中文标题】如何防止我的网站页面被加载到其他网站的 iframe 中?【英文标题】:How to prevent my site page from being loaded into other website iframe? 【发布时间】:2013-09-18 23:09:50 【问题描述】:

我们有很多游戏网站,其中我在我的服务器上托管独家游戏,我不想从我的服务器访问我的游戏到其他网站。我想限制他们从我的服务器访问我的内容。

例如,假设我有一个名为 www.abc.com 的网站,位于像 www.abc.com/games/abcgame.swf 这样的源路径,我在其中托管了我的独家游戏。因为我希望其他网站持有者不要访问此内容。如果他们窃取了这个 url 并试图访问,那么我想显示一些自定义消息,例如“找不到游戏”或类似“请访问 www.abc.com 玩这个游戏”之类的消息。等等

谁能有任何想法来实现这个功能?

【问题讨论】:

Restricting IFRAME access in php的可能重复 【参考方案1】:

您无法在 chrome 中访问 window.parent.location。所以请改用 document.referrer

 window.onload = function()
    
       try
       
           if (window.parent && document.referrer !== "https://www.yousite.com/")
           console.log(document.referrer);
    
              throw new Error();
           
       
       catch (e)
          window.location.href = "https://yoursite.com";
       
    
    

【讨论】:

【参考方案2】:

第一个解决方案是使用 X-Frame-Options 标头来防止将您的页面加载到 iframe。 X-Frame-Options 可以指定以下两个值之一:SAMEORIGIN,仅 允许来自同一来源的 iframe 显示此内容,以及 deny,这可以防止 任何 iframe 都会这样做。但此标头不是 HTTP 规范的一部分,是由 Microsoft 引入的,因此并非所有浏览器都支持此标头。 X-Frame-Options的一个例子:

X-Frame-Options: SAMEORIGIN

如果某些旧浏览器不支持 X-Frame-Options 标头。您可以尝试一种称为FrameKiller 的技术。但是,正如该链接中所指出的那样,存在一些限制。

用户代理不支持 javascript

用户代理支持 JavaScript,但用户已关闭支持。

用户代理的 JavaScript 支持存在缺陷或部分实现。

这个想法是使用 javascript 来检测您的页面是否加载到 iframe 中。有很多方法可以实现帧杀手脚本。

根据您的要求,您可以像这样实现一个框架杀手脚本:尝试访问您的父窗口以读取window.location。如果他们将您的页面包含在其 iframe 中,则代码将引发异常(跨域)

示例代码:

window.onload = function()
   try
   
       if (window.parent && window.parent.location.hostname !== "www.abc.com")
          throw new Error();
       
   
   catch (e)
      alert("Please visit www.abc.com to play this game.");
      //You could do whatever you want here
   

【讨论】:

我尝试了该代码,但得到 DOMException: Blocked a frame with origin from access a cross-origin frame。 @Daniel Soublett:该异常是代码的目的 @Daniel Soublett:该异常意味着 iframe 已加载到另一个域中 您的 javascript 无法运行。您只会收到一条错误消息“阻止了具有来源的框架......无法访问跨域框架。” @Enrico:这是一个框架杀手脚本,预计会出现错误,因此其他网站无法将您的网站嵌入到他们的 iframe 中。【参考方案3】:
if (window.top != window.self) 
                window.top.location = window.self.location;
            

它首先检查最顶层的框架是否是框架本身,如果不是,它将顶层框架更改为这个框架。它是javascript。

【讨论】:

【参考方案4】:

通过 JavaScript 执行此操作的限制在于它将内容限制在浏览器级别。您最好使用 Apache mod_rewrite 来更有效地阻止服务器级别 as explained here 上的内容。

例如,如果您的服务器支持,您可以将此代码放在.htaccess 文件中。我以www.abc.com 为例,并以匹配swffla 文件为例:

RewriteCond %HTTP_REFERER !^$
RewriteCond %HTTP_REFERER !^http://(www\.)?abc.com/.*$ [NC]
RewriteRule ^.*\.(swf|fla)$ - [F] 

【讨论】:

我对Apache不熟悉,看代码,我猜这个技术依赖于http reffer。如果是这种情况,如果他们在 iframe 中加载我们的页面,它怎么能工作,因为在这种情况下,http 引荐来源是我们的第二个请求的域,而对于 iframe 的第一个请求,则为 null。 好吧,既然如此,那就如此吧。

以上是关于如何防止我的网站页面被加载到其他网站的 iframe 中?的主要内容,如果未能解决你的问题,请参考以下文章

防止自己的页面不被其他网站的页面的iframe引用

JS防止页面被其他网站iframe使用方法

如何阻止我的网站加载到其他网站 iframe

防止页面跳转到 iframe

如何处理没有 id 的 iframe

在 iframe 中加载另一个域网站