Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止我的网站页面被加载到其他网站iframe?_Javascript_Php_Html_Iframe - Fatal编程技术网

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

Javascript 如何防止我的网站页面被加载到其他网站iframe?,javascript,php,html,iframe,Javascript,Php,Html,Iframe,我们有很多游戏网站,其中我在我的服务器上托管独家游戏,我不想从我的服务器访问其他网站。我想限制他们从我的服务器访问我的内容 例如,假设我有一个名为www.abc.com的网站,其源路径类似于www.abc.com/games/abcgame.swf,我在其中托管了我的独家游戏。因为我希望其他网站持有者不要访问此内容。如果他们窃取了这个url并试图访问,那么我想显示一些自定义消息,如“未找到游戏”或类似“请访问www.abc.com玩这个游戏”等 有没有人有任何想法来实现此功能?第一种解决方案是使

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

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


有没有人有任何想法来实现此功能?

第一种解决方案是使用页眉来防止将页面加载到iframe。可以指定两个值中的一个:
SAMEORIGIN
,仅 允许来自同一来源的iFrame显示此内容,并禁止 任何人都不能这样做。但是这个头不是HTTP规范的一部分,是由Microsoft引入的,所以不是所有浏览器都支持这个头。例如:

以防一些旧浏览器不支持
X-Frame-Options
标题。你可以尝试一种叫做。不过,正如该链接中指出的那样,也存在局限性

用户代理不支持JavaScript

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

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

其思想是使用javascript来检测页面是否加载到iframe中。有许多方法可以实现帧杀手脚本

根据您的需要,您可以实现这样一个框架杀手脚本:尝试访问父窗口以读取
窗口。位置
。如果他们在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
   }
}

通过JavaScript实现这一点受到限制,因为它将内容限制在浏览器级别。您最好使用Apache
mod_rewrite
,以便更有效地阻止服务器级别的内容

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

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

它首先检查最顶层的帧是否为帧本身,如果不是,则将顶层帧更改为该帧。它是javascript。

您无法在chrome中访问window.parent.location。因此,请使用文档。参考者

 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";
       }
    
    }

我不熟悉Apache,通过查看代码,我猜这项技术依赖于httpreffer。如果是这样的话,如果他们在一个iframe中加载我们的页面,它怎么能工作呢?因为在这个例子中,http referer对于第二个请求是我们的域,对于iframe的第一个请求是null。好的,如果是这样的话,就是这样。我试过那个代码,但我得到了DomeException:阻止了一个带有原点的帧访问交叉原点帧。@Daniel Soublett:这个异常就是code@DanielSoublett:这个异常意味着iframe被加载到另一个域上,您的javascript将无法工作。您只会收到一个错误“阻止了一个带有原点的帧..访问跨原点帧”。@Enrico:这是一个帧杀手脚本,预计会收到一个错误,因此其他网站无法将您的站点嵌入其iframe中。
if (window.top != window.self) {
                window.top.location = window.self.location;
            }
 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";
       }
    
    }