再论X-Frame-Options选项

By | 2017年5月25日

配置更安全的https连接一文中,根据安全网站的建议,对web服务器的https做了诸多安全性改进的配置,其中一项便是X-Frame-Options。

配置之初,只是简单的看了一下选项的介绍,认为作用是 决定页面是否是否应该加载frame。接下来发生的三件事彻底改变了我对该项的理解:

  1. 最初本站设置X-Frame-Options设置为DENY,站点升级了新版的WordPress程序后,关于页面竟然无法加载。按F12打开控制台查看,发现是X-Frame-Options的问题。将选项注释掉或者改成SAMEORIGIN后显示正常。此事让我对X-Frame-Options开始了关注。
  2. 本站开通Google Adsense后,能以iframe的方式正常加载广告。这现象与我对X-Frame-Options的理解有了冲突。简单对比WordPress程序的关于页面和Adsense广告加载方式,我认定Adsense是以JavaScript的方式动态加载的iframe,所以不受限制。
  3. 公司的协作使用了禅道,部署上线后有反馈说页面有问题。在后台查看log,没看到任何错误输出。心想应该是前端跳转问题,于是让同事演示给我看。一看是X-Frame-Options设置为DENY的问题,这次终于让我醒悟了过来。

X-Frame-Options选项,控制的是本站页面能否以iframe的方式嵌入到其他页面中。如果是DENY,则页面只能是父级页面,不能被嵌入在其他任何网页中;如果是SAMEORIGIN或者指定站点,则只能嵌套在限定站点的页面中;注释掉则无限制,页面可以被任意嵌套。

再回过头来看Google Adsense和禅道的问题:Google的广告站点未设置该选项,所以能顺利展示;运行禅道的服务器设置了X-Frame-Options DENY,因而浏览器拒绝在iframe中展示表单提交后的页面。

再看玄魂的点击劫持(clickjacking)与X-Frame-Options Header文章,提到了X-Frame-Options头部可以防止点击劫持。正常站点不会点击劫持用户。在非法站点中,网站引入以iframe的方式引入正常站点的页面并设置为透明不显示,用户点击虚假网站上的页面或图片后,实际上触发了正常站点的操作。如果启用了X-Frame-Options的DENY选项,浏览器会拒绝在虚假的站点中以iframe的形式展现正常站点的页面,从而避免了这一情况的发生。

参考

  1. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options
  2. http://www.cnblogs.com/xuanhun/p/3610981.html

发表评论

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