5

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

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

任何人都可以有任何想法来实现这个功能吗?

4

4 回答 4

8

第一个解决方案是使用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
   }
}
于 2013-09-14T09:39:38.983 回答
3
if (window.top != window.self) {
                window.top.location = window.self.location;
            }

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

于 2014-02-13T05:41:14.370 回答
1

通过 JavaScript 执行此操作受限于它将内容限制到浏览器级别的方式。您可能会更好地使用 Apachemod_rewrite来更有效地阻止服务器级别的内容,如此处所述

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

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?abc.com/.*$ [NC]
RewriteRule ^.*\.(swf|fla)$ - [F] 
于 2013-11-06T03:33:41.003 回答
0

您无法在 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";
       }
    
    }
于 2021-03-29T14:30:37.867 回答