最近检查 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 错误记录已经减少了很多了。©
本文发表于水景一页。永久链接:<https://cnzhx.net/blog/wp-x-frame-options/>。转载请保留此信息及相应链接。
学习了
用上了啊~ 还有JS也可以处理被嵌套
简单问题简单解决嘛