什么是跨站脚本攻击XSS?

跨站脚本攻击XSS(Cross Site Script Execution的缩写),是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。
XSS分类

XSS根据效果的不同,可以分为以下几类:
- 反射型XSS
给用户发送页面或者链接,让用户点击来进行攻击,也叫做“非持久型XSS”。
- 存储型XSS
把攻击存放在服务端,可能造成传播(比如博客系统,每个访问该页面的人都有可能被攻击),主动性更强。
比较常见的一种场景就是,黑客写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的Javascript代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击叫做“存储型XSS”。也叫做“持久型XSS”,因为从效果上来说,它存在的时间是比较长的。
- DOM型
本质上是反射型,但是是通过用户点击,修改原本dom元素的属性,构造攻击动作。
反射型和dom型区别:反射型是构造好了攻击动作,然后就等你打开那个页面;dom型也是等你点击,但是不是页面,通过用户动作,把原来的动作注释掉,然后加上自己修改的动作。
XSS原理

主要是依靠一切可能的手段,将浏览器中可以执行的脚本(javascript)植入到页面代码中,从而对用户客户端实施攻击。这才是我认为在目前这个“大前端时代”xss攻击的定义。
实际上黑客攻击这种行为从本质上讲,就是想尽一切手段在别人的代码环境中执行自己的代码。
这件事情又可以分为两部分进行研究,一是如何把代码植入到对方的系统中去,二是植入进去的代码能不能被对方的系统执行。
xss漏洞是对web客户端(浏览器)的攻击,所以说植入的代码基本上以javascript和html标签(有时也有结合css样式的xss向量)为主。
实施XSS攻击需要具备两个条件:1、需要向web页面注入恶意html代码;2、这些恶意代码能够被浏览器成功的执行。
XSS破坏方式

- 破坏页面结构
用户输入的内容包含了html的标签,与前面的标签等闭合,导致页面的DIV结构发生变化,页面错乱。
- 破坏显示内容
用户输入的内容包含了单引号或双引号,与前面的单引号或双引号匹配,导致后面的内容丢失,显示不出来。
- 破坏JS
用户产生的内容直接输出到js片断中,但仅转义少数字符不能保证排除攻击,所以容易导致JS被破坏。
跨站脚本攻击防御

- 设置HttpOnly
现在HttpOnly已经逐渐成为一个标准。浏览器将禁止页面的JavaScript访问带有HttpOnly属性的Cookie。现在主流浏览器都已支持HttpOnly。
如果是业务需要增加cookie,同时需要给这个cookie设置为HttpOnly属性。
例如:
response.setHeader("Set-Cookie