如何阻止Iframe调用

22
最近两个其他域名通过iframe嵌入我的整个网站。我想要阻止那些试图通过iframe展示我的网站的其他网站。如何通过.htaccess实现阻止呢?
5个回答

68

你可以在头部设置变量 X-Frame-Options: Deny。

所有现代浏览器都支持 X-Frame-Options 标头。

Facebook 使用此标头禁用 iframe/frameset(还有 JavaScript)。

如果你已经在 Apache 中启用了 mod_headers:

.htaccess

Header set X-Frame-Options DENY

但是,您可以启用来自相同源的iframe。

Header always append X-Frame-Options SAMEORIGIN

或者在Nginx中:

add_header X-Frame-Options Deny; #or SAMEORIGIN

浏览器兼容性: 来源

  • Internet Explorer: 8.0
  • Firefox (Gecko): 3.6.9 (1.9.2.9)
  • Opera: 10.50
  • Safari: 4.0
  • Chrome: 4.1.249.1042

1
我认为这是最好的方法。另一种适当的方式是使用PHP:header("X-Frame-Options: SAMEORIGIN")... JS或引荐者是无意义的。 - emfi
1
注意:Header指令在mod_headers Apache模块中。您需要确保该模块已加载到Apache服务器中。 - sj59

3

我不认为你可以通过 .htaccess 实现,但你可以使用JS来实现。你可以使用类似这样的函数进行检查:

function parentIsSameOrigin()
{
    var result = true;
    if (window.parent)
    {
        result = Boolean
        (
            // more precise modifications needed here
            window.this.location.href.indexOf(window.parent.location.href) == 0
        );
    }
    return result;
}

1
嗯... 但如果客户端浏览器禁用了 JavaScript 呢? - Chris Forrence
如果这是一个合法的问题,那么没有其他办法,我会使用JS加载Iframe的内容,以确保除非函数验证通过,否则不会显示任何内容。 - udjamaflip
你可以在CSS中使用display:none,并在JavaScript中将其删除。这会强制不显示内容,如果用户已禁用JavaScript(这在现代标准下是不可接受的)。 - dtakis

2
您不能完全“强制执行”它,因为有绕过方法,但您可以使用标准的头部方法。html5-boilerplate具有一个不错的vhost / htaccess片段,首先将X-Frame-Options设置为您选择的DENY / SAMEORIGIN / ALLOW-FROM,然后允许白名单MIME类型用于良好的框架,例如Google图像搜索。
请查看链接获取最新信息,但以下是2016年1月25日在SAMEORIGIN模式下的示例:
<IfModule mod_headers.c>

     Header set X-Frame-Options "SAMEORIGIN"

     <FilesMatch "\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$">
         Header unset X-Frame-Options
     </FilesMatch>

</IfModule>

-1
你可以使用以下的 .htaccess。
RewriteEngine On

RewriteCond %{QUERY_STRING} !^id=[^&]+ [NC]
# if referrer is bad.com
RewriteCond %{HTTP_REFERER} (www\.)?bad\.com [NC]
# then redirect to a different page
RewriteRule !^404.shtm [L,NC,R=302]

你需要依赖于HTTP_REFERER,因为这段代码将重定向任何来自bad.com的请求到未找到页面

这个解决方案对此答案做出了贡献

https://stackoverflow.com/a/19773719/1641233


-4

嗯,我认为你不能这样做。

iframe 是一个客户端容器,这意味着最终用户的浏览器负责加载 iframe 中的内容。你无法区分你的页面是否在一个 iframe 中加载。


1
这不是真的。您可以通过JavaScript检查网页是否为“顶部”。window.top === window - Derek 朕會功夫

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接