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

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

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

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

【问题讨论】:

标签: javascript php html iframe


【解决方案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。
      • 好吧,既然如此,那就如此吧。
      猜你喜欢
      • 2017-11-03
      • 2011-02-23
      • 2012-11-25
      • 1970-01-01
      • 2019-04-18
      • 2013-03-02
      • 1970-01-01
      相关资源
      最近更新 更多