禁止网页被别的网站嵌套展示

最近检查 Google Webmaster 的时候发现很多链接地址错误。它们来自一些提供搜索服务但并不是我们常见的搜索引擎的网站。其中甚至有些网站的搜索结果并不会跳转到对应网站,而是将相应的网页通过 <frame> 方式嵌入到自己的网站来展示。可以通过 X-Frame-Options 来使这种方式失效,一是避免网页被人恶意使用,二是避免GW中的那些错误记录。

相关的问题在 Clickjacking 页面介绍得非常详细。并且这个网页上还提供了一些非常规的方法。

X-Frame-Options 参数

X-Frame-Options 有三个参数:

  • DENY:页面不会展示在任何网站的 frame 里面。
  • SAMEORIGIN:页面只能展示在具有相同来源的 frame 里面。也就是说,嵌在 frame 里面的网址的域名与嵌有 frame 的网页的域名是一致的情况下可以展示该页面。
  • ALLOW-FROM uri:只有指定来源的网页可以展示我们的页面。

所以比较保险的用法是使用第二个参数 SAMEORIGIN。别的网站不能嵌套我们的网页,但是我们自己可以。

实施方式

可以通过配置网页服务器(如 Apache)实现,也可以直接作为页面 header 的内容硬编入页面源代码(该方式不符合 HTML 规范)。

配置网页服务器

在网页服务器中配置按说是最省事的。相应的设置可以参考这里。其中,Apache 服务器的配置为,在网站的主机配置中加入下面的代码。也可以加入到网站的 .htaccess 文件中。

<ifModule mod_headers.c>
    Header always append X-Frame-Options SAMEORIGIN
</ifModule>

当然这个需要 Apache 启用了 mod_headers 模块。

另外,按照这里的讨论,可以直接写成,

<ifModule mod_headers.c>
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN
    X-Content-Type-Options: nosniff
</ifModule>

这里同时加入了另外两个选项以提高网站安全性。或者写成,

<ifModule mod_headers.c>
    Header set X-XSS-Protection "1; mode=block"
    Header always append X-Frame-Options SAMEORIGIN
    Header set X-Content-Type-Options: "nosniff”
</ifModule>

这两者是等效的。

如果是 Nginx,可以在 http、server 或者是 location 配置中加入,

add_header X-Frame-Options SAMEORIGIN;

重启网页服务器就生效了。

但是不知道为什么,我的 Apache 服务器上的 WordPress 网站页面的响应头文件里却没有。一个可能性极大的原因是使用的 WP Super Cache(WPSC) 插件缓存造成的。将 WP Super Cache 改成 php 模式之后就没有这个问题了。

采用这个方法后,这段时间由于别的网站 frame 嵌套带来的 403、404 错误记录已经减少了很多了。©

本文发表于水景一页。永久链接:<http://cnzhx.net/blog/wp-x-frame-options/>。转载请保留此信息及相应链接。

3 条关于 “禁止网页被别的网站嵌套展示” 的评论

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)