攻击原理

恶意用户使用某种途径将透明的HTML内容定位到其他HTML元素上方,使用户以为在点击所看到的内容时,被恶意用户所拦截,并进行其他操作。示例:假设www.a.com/a.html的内容如下:

<html>
<body>
    ...
    <button type="button">Get Free Ipad!</button> <!-- 正常网站提供的代码 --->
    ...
    <iframe src="http://www.b.com/b.html" style="position:absolute; ..."><iframe> <!-- 恶意用户的代码 --->
    ...
</body>
</html>

假设www.b.com/b.html的内容如下:

<html>
<body>
    ...
    <button type="button">Watch Me!</button> <!-- 正常网站提供的代码 --->
    ...
</body>
</html>

防御方式

使用 X-Frame-Options

可选值:

  • DENY - 禁止响应的HTML被作为iframe内容
  • SAMEORIGIN - 只允许当前域下其他网页可以将当前响应的HTML作为iframe内容
  • ALLOW-FROM uri - 只允许指定URL将当前响应的HTML作为iframe内容

在示例中,www.b.com就应该为/b.html设置以下HTTP响应头来禁止该内容被恶意用户作为iframe内容在其他网站上使用。

X-Frame-Options:DENY
浏览器 支持DENY/SAMEORIGIN的版本 支持ALLOW-FROM的版本
Chrome 4.1.249.1042
Firefox (Gecko) 3.6.9 (1.9.2.9) 18.0
Internet Explorer 8.0
Opera 10.50
Safari 4.0

不足之处

  • 需要为每个页面均进行设定
  • 多域名、有子域名时设置繁琐
  • 代理服务器可能会删除该HTTP响应头而造成保护失效

使用 JavaScript

到目前为止,对老浏览器的处理最好方式:在每个页面中均引入以下代码

  <style id="antiClickjack">body{display:none !important;}</style>
  <script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
  </script>