1、XSS 是个啥?
XSS 是跨站脚本攻击 (Cross Site Scripting),为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。
通俗点说,XSS 就是在一个站点,当我们用户去访问,在渲染 HTML 的过程中,出现了一些没有预期的脚本指令,脚本指令执行时就产生了一个 XSS。XSS 的攻击涉及到三方,分别是攻击者、用户以及 web 服务器,用户通过浏览器访问 web 网页,攻击者会想尽办法在用户访问页面时插入一段脚本,让用户在访问界面的时候就可以执行该脚本,这样攻击者就可以通过插入的执行脚本去获取一些用户的信息(比如说 cookie),并将其发送到攻击者自己的网站,这就是跨站。
ps:在 Vue 中具有一个 v-html 的指令,他就很容易引起这种 XSS 安全问题。
2、XSS 的危害
在真正的应用中,XSS 攻击的危害还是挺多的,比如下面罗列几种:
- 挂马:
- 攻击者会通过入侵网站,并将一个木马程序传到一个网站中,使用户在打开网页时木马程序就会运行。
- 盗取用户 cookie:
- 在网页浏览中我们常常涉及到用户登录,登录完毕之后服务端会返回一个 cookie 值。这个 cookie 值相当于一个令牌,拿着这张令牌就等同于证明了你是某个用户。
- 如果你的 cookie 值一旦被窃取,那么攻击者很可能直接利用你的这张令牌不用密码就登录你的账户。如果想要通过script 脚本获得当前页面的 cookie 值,通常会用到 document.cookie。
- 试想下如果像空间说说中能够写入XSS 攻击语句,那岂不是看了你说说的人的号你都可以登录(不过某些厂商的 cookie 有其他验证措施如:Http-Only 保证同一 cookie 不能被滥用)
- 劫持流量实现恶意跳转:
- 比如在网页中想办法插入一句像这样的语句:<script>window.location.href="http://www.baidu.com";</script>
- 那么所访问的网站就会被跳转到百度的首页,这样百度就会从中获取用户或流量上的一些收益。
导致 XSS 的主要原因是过于信任客户端提交的数据!当然,除了以上几种还有很多其他的危害,由于我本人不是专攻信息安全领域的,所以就没有再做深入了解,如有对这方面感兴趣的同学,可以自己研究一下。
3、XSS 的种类
XSS 主要有两种,分别是: 反射型、存储型,下面分别介绍一下:
- 反射型(非持久型 XSS):服务端返回脚本,客户端执行
- 也就是攻击相对于访问者而言是一次性的,具体表现在我们把我们的恶意脚本通过 url 的方式传递给了服务器,而服务器则只是不加处理的把脚本“反射”回访问者的浏览器,而使访问者的浏览器执行相应的脚本。
- 存储型(持久型 XSS):后端存储了非法脚本,并且前端直接展示
- 比如留言板功能,恶意用户 A 在在用户 B 的空间留言板留言时,写的是一个含有 XSS 的评论,这个 XSS 脚本就会跟随请求发送到服务器(并存储到服务器上),用户 B 及其他用户在访问 B 的留言板时,服务器就会将恶意用户 A 的评论返回,用户 B 及其他用户一旦查看页面就会执行服务器返回的 XSS 脚本,导致一些安全性的问题。
4、XSS 防范手段
都说知己知彼方能百战不殆,知道了XSS 攻击的原理,那么防御的方法也就显而易见了。防御的主要思想是:
(1)对输入(和 URL 参数)进行 过滤,过滤掉哪些可能会导致脚本执行的相关内容,比如 <script>、<img>、<a> 等标签。
(2)对一些常见的符号,如 <> 进行转换 编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。
(3)对动态输出到页面的内容进行 HTML 编码,让该脚本没有办法在浏览器中执行。