如何防止我的网站页面被加载到其他网站的 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
为例,并以匹配swf
和fla
文件为例:
RewriteCond %HTTP_REFERER !^$
RewriteCond %HTTP_REFERER !^http://(www\.)?abc.com/.*$ [NC]
RewriteRule ^.*\.(swf|fla)$ - [F]
【讨论】:
我对Apache不熟悉,看代码,我猜这个技术依赖于http reffer。如果是这种情况,如果他们在 iframe 中加载我们的页面,它怎么能工作,因为在这种情况下,http 引荐来源是我们的第二个请求的域,而对于 iframe 的第一个请求,则为 null。 好吧,既然如此,那就如此吧。以上是关于如何防止我的网站页面被加载到其他网站的 iframe 中?的主要内容,如果未能解决你的问题,请参考以下文章