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

最近检查 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 条关于 “禁止网页被别的网站嵌套展示” 的评论

雁过留声,人过留名

电子邮件地址不会被公开。 必填项已用*标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南