前端安全之XSS

XSS, 即为(Cross Site Scripting), 中文名为跨站脚本, 是发生在目标用户的浏览器层面上的,当渲染DOM树的过程成发生了不在预期内执行的JS代码时,就发生了XSS攻击。
跨站脚本的重点不在‘跨站’上,而在于‘脚本’上。大多数xss攻击的主要方式是嵌入一段远程或第三方域上的js代码,实际上是在目标网站的作用域下执行了这段js代码。

XSS攻击方式

反射型xss:也叫非持久型xss,是指发生请求时,xss代码出现在请求url中,作为参数提交到服务器,服务器解析并响应,响应结果中包含了xss代码,最后浏览器解析并执行。

存储型xss:也叫持久型xss, 主要是将xss代码发送到服务器(不管是数据,内存还是文件系统等),然后在下次请求页面的时候就不用带上xss代码了。
最典型的就是留言板xss , 用户提交了一条包含xss代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有xss代码,就当做正常的html和js解析执行。xss攻击就发生了。

DOM XSS:Dom xss攻击不同于反射型xss和存储型xss, Dom xss代码不需要服务器端的解析响应的直接参与,而是通过浏览器端的dom解析,这完全是客户端的事情。

XSS危害

通过document.cookie盗取cookie
使用js或css破坏页面正常的结构与样式
流量劫持(通过访问某段具有window.location.href定位到其他页面)
Dos攻击:利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的
如发微博、加好友、发私信等操作。
利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。

XSS防御

对Cookie的保护
对重要的cookie设置httpOnly,防止客户端通过document.cookie读取cookie。服务端可以设置此字段。
对用户输入数据的处理
编码:不能对用户输入的内容都保持原样,对用户输入的数据进行字符实体编码。对于字符实体的概念可以参考文章底部给出的参考链接。
解码:原样显示内容的时候必须解码,不然显示不到内容了。
过滤:把输入的一些不合法的东西都过滤掉,从而保证安全性。如移除用户上传的DOM属性,如onerror,移除用户上传的Style节点,iframe, script节点等。
存在一个parse函数,对输入的数据进行处理,返回处理之后的数据对输入的数据(如DOM节点)进行解码(使用第三方库 he.js)过滤掉一些元素有危害的元素节点与属性节点。如script标签,onerror事件等。(使用第三方库HTMLParser.js)


一旦在DOM解析过程成出现不在预期内的改变(JS代码执行或样式大量变化时),就可能发生XSS攻击
XSS分为反射型XSS,存储型XSS和DOM XSS
1.反射型XSS是在将XSS代码放在URL中,将参数提交到服务器。服务器解析后响应,在响应结果中存在XSS代码,最终通过浏览器解析执行。
2.存储型XSS是将XSS代码存储到服务端(数据库、内存、文件系统等),在下次请求同一个页面时就不需要带上XSS代码了,而是从服务器读取。
3.DOM XSS的发生主要是在JS中使用eval造成的,所以应当避免使用eval语句。
4.XSS危害有盗取用户cookie,通过JS或CSS改变样式,DDos造成正常用户无法得到服务器响应。
5.XSS代码的预防主要通过对数据解码,再过滤掉危险标签、属性和事件等。