XSS和CSRF防范
十一月 02, 2020
一. XSS
概念
XSS,即 Cross Site Script,也叫跨站脚本攻击;其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS。XSS攻击通过js代码劫持客户端跟服务器之间的会话。
方式
持久型
恶意代码会随着用户输入通过提交方式保存到服务器数据库,其他用户浏览保存的内容后进行恶意攻击。
存储型
- 攻击者通过网页输入(input或者textarea等)将恶意代码(比如js)通过提交的方式保存到服务器数据库中;
- 用户浏览内容时将服务端保存的内容下载到浏览器;
- 浏览器在解析代码时,恶意代码被执行。
常见应用场景:论坛发帖、商品评论、用户私信等。
非持久型
不会保存到数据库。
反射型
- 攻击者构造出含有恶意参数的url,诱导用户进行点击;
- 服务端没有做特殊检测,返回时将恶意代码带回;
- 客户端解析并执行恶意代码。
常见应用场景:通过 URL 传递参数的场景,如网站搜索、跳转。
DOM型
通过修改DOM结构达到的攻击,是纯粹发生在客户端的攻击。
防范
总结以上3种攻击方式,基本上都是开发者对用户输入内容未做安全性校验,直接造成了注入漏洞。
- 对于输入型组件进行输入校验,过滤特殊字符,关键字等,并进行转义
- 对于a链接进行白名单校验,禁止以javascript:开头
二. CSRF
概念
CSRF,即 Cross Site Request Forgery,中译是跨站请求伪造,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。
流程
- 受害者登录a.com(正常网站),在本地保留了cookie信息;
- 攻击者引诱用户访问b.com;
- 在b.com向a.com发送请求(比如a.com?act=xxx),浏览器会默认携带a.com的cookie信息;
- 服务端接收到请求后进行cookie校验,合理通过;
- a.com以受害者的名字执行了恶意操作。
防范
同源验证
既然CSRF大多来自第三方网站,那么我们就直接禁止外域(或者不受信任的域名)对我们发起请求。浏览器发起请求是Request Header中会带有Origin和Referer这两个字段,标记来源域名(IE11中不存在Orgin,302重定向也没有,Referer可以被前端屏蔽)。
请求头添加其他属性校验
可以在登录后让后端返回一个例如token之类的字段,保存到session或者localStorage中(不能保存在cookie中),然后在提交的时候手动添加到cookie中(利用的是此类攻击不能获取本地信息)
Samesite Cookie
这是Google发起的一份草案,用来标记是不是同域名cookie,有两个属性值:
- Strict(Cookie无论什么情况下都不能作为第三方的Cookie)
- Lax(如果这个请求改变了当前页面或者打开新页面,且携带GET请求,则这个Cookie可作为第三方Cookie)
缺点是不支持子域名,同时兼容性不好。