Web/15-前端面试/07-安全问题:CSRF和XSS.md
2021-07-29 11:08:52 +08:00

211 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 07-安全问题CSRF和XSS
publish: true
---
<ArticleTopAd></ArticleTopAd>
## 前言
面试中的安全问题,明确来说,就两个方面:
- CSRF基本概念、攻击方式、防御措施
- XSS基本概念、攻击方式、防御措施
这两个问题,一般不会问太难。
有人问SQL注入算吗答案这个其实跟前端的关系不是很大。
## CSRF
问的不难,一般问:
- CSRF的基本概念、缩写、全称
- 攻击原理
- 防御措施
如果把**攻击原理**和**防御措施**掌握好,基本没什么问题。
### 1、CSRF的基本概念、缩写、全称
CSRFCross-site request forgery**跨站请求伪造**。
PS中文名一定要记住。英文全称如果记不住也拉倒。
### 2、CSRF的攻击原理
![](http://img.smyhvae.com/20180307_1735.png)
用户是网站A的注册用户且登录进去于是网站A就给用户下发cookie。
从上图可以看出要完成一次CSRF攻击受害者必须满足两个必要的条件
1登录受信任网站A并在本地生成Cookie。如果用户没有登录网站A那么网站B在诱导的时候请求网站A的api接口时会提示你登录
2在不登出A的情况下访问危险网站B其实是利用了网站A的漏洞
我们在讲CSRF时一定要把上面的两点说清楚。
温馨提示一下cookie保证了用户可以处于登录状态但网站B其实拿不到 cookie。
举个例子前段时间里微博网站有个api接口有漏洞导致很多用户的粉丝暴增。
### 3、CSRF如何防御
**方法一、Token 验证:**(用的最多)
1服务器发送给客户端一个token
2客户端提交的表单中带着这个token。
3如果这个 token 不合法,那么服务器拒绝这个请求。
**方法二:隐藏令牌:**
把 token 隐藏在 http 的 head头中。
方法二和方法一有点像,本质上没有太大区别,只是使用方式上有区别。
**方法三、Referer 验证:**
Referer 指的是页面请求来源。意思是,**只接受本站的请求,服务器才做响应**;如果不是,就拦截。
## XSS
### 1、XSS的基本概念
XSSCross Site Scripting**跨域脚本攻击**。
接下来,我们详细讲一下 XSS 的内容。
> 预备知识HTTP、Cookie、Ajax。
### XSS的攻击原理
XSS攻击的核心原理是不需要你做任何的登录认证它会通过合法的操作比如在url中输入、在评论框中输入向你的页面注入脚本可能是js、hmtl代码块等
最后导致的结果可能是:
- 盗用Cookie
- 破坏页面的正常结构,插入广告等恶意内容
- D-doss攻击
### XSS的攻击方式
- 1、反射型
发出请求时XSS代码出现在url中作为输入提交到服务器端服务器端解析后响应XSS代码随响应内容一起传回给浏览器最后浏览器解析执行XSS代码。这个过程像一次反射所以叫反射型XSS。
- 2、存储型
存储型XSS和反射型XSS的差别在于提交的代码会存储在服务器端数据库、内存、文件系统等下次请求时目标页面时不用再提交XSS代码。
### XSS的防范措施encode + 过滤)
XSS的防范措施主要有三个
**1、编码**
对用户输入的数据进行`HTML Entity`编码。
如上图所示,把字符转换成 转义字符。
Encode的作用是将`$var`等一些字符进行转化,使得浏览器在最终输出结果上是一样的。
比如说这段代码:
```
<script>alert(1)</script>
```
若不进行任何处理则浏览器会执行alert的js操作实现XSS注入。
进行编码处理之后L在浏览器中的显示结果就是`<script>alert(1)</script>`,实现了将$var作为纯文本进行输出且不引起JavaScript的执行。
参考链接:[4类防御XSS的有效方法](https://www.jianshu.com/p/599fcd03fd3b)
**2、过滤**
- 移除用户输入的和事件相关的属性。如onerror可以自动触发攻击还有onclick等。总而言之过滤掉一些不安全的内容
- 移除用户输入的Style节点、Script节点、Iframe节点。尤其是Script节点它可是支持跨域的呀一定要移除
**3、校正**
- 避免直接对`HTML Entity`进行解码。
- 使用`DOM Parse`转换校正不配对的DOM标签。
备注:我们应该去了解一下`DOM Parse`这个概念它的作用是把文本解析成DOM结构。
比较常用的做法是通过第一步的编码转成文本然后第三步转成DOM对象然后经过第二步的过滤。
**还有一种简洁的答案:**
首先是encode如果是富文本就白名单。
## CSRF 和 XSS 的区别
面试官还可能喜欢问二者的区别。
区别一:
- CSRF需要用户先登录网站A获取 cookie。
- XSS不需要登录。
区别二:(原理的区别)
- CSRF是利用网站A本身的漏洞去请求网站A的api。
- XSS是向网站 A 注入 JS代码然后执行 JS 里的代码篡改网站A的内容。
## 其他
### XSS
关于XSS推荐几个网站
- <http://html5sec.org/>
里面列出了很多XSS的例子可以长见识。如果你专门研究XSS可以看看。
- [FreeBuf网站上的专栏作者Black-Hole](http://www.freebuf.com/author/black-hole)
比如,他的第一篇文章就讲到了[XSS的原理分析与解剖](http://www.freebuf.com/articles/web/40520.html)。有句话摘抄如下弹窗只是测试xss的存在性和使用性。
比如,这个人还有篇文章写[自动化检测CSRF第一章](http://www.freebuf.com/articles/web/107207.html)。大公司做网站一般会做嗅探服务比如自动化工具做CSRF的检测、自动化的方式控制安全风险
另外,可能还有些工具,可以扫描代码本身有没有一些安全问题。
- [GitHub | Cure53](https://github.com/cure53)
这是GitHub上的一个德国组织。
上面的项目都跟安全相关有些仓库是可以直接运行的。如果你不需要定制就可以直接用别人的没必要自己写XSS库、XSS的过滤之类的避免麻烦。