## 一篇搞b站的文章
### `csrf`攻击简述:
* `CSRF`(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:`CSRF/XSRF`
* 你这可以这么理解`CSRF`攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。
* 具体原理就不详细解释了推荐一篇文章:[浅谈CSRF攻击方式](https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html)
* 了解过`csrf`攻击, 我们应该明白, 所谓的`csrf`攻击就是:
* 你在你的常用网站登录了
* 此时被`xxx`恶意网站的连接吸引, 访问`xxx`恶意网站
* `xxx`恶意网站的页面向的常用网站发起跨域请求
* 跨域请求中携带了常用网站的cookie, 盗用了你的登录状态
### `csrf`思路分析:
浏览器支持的跨域请求的方式大体有两种:
* `cros` 官方标准, 使用时需要服务端支持, 否则会有请求方法和header限制(header限制不能携带cookie),有两种请求方式这里不做过多介绍, 依然推荐一篇文章:[跨域资源共享 CORS 详解](http://www.ruanyifeng.com/blog/2016/04/cors.html),总之`cros`很安全。
* `jsonp` 方式, 限制是只能使用GET请求(规范GET请求都是只读操作), body中无法携带数据。
### 网络上`open某li某li`的`csrf`防御
* 全局的`jsonp CSRF`防御:
![全局-csrf防御.PNG](https://static.studygolang.com/200514/f612352719e47599322755580d02148e.PNG)
* 首先需要知道的一点是, `jsonp` 方式发起的跨域请求`header`中一定有`referer`字段
* 如果请求没有携带`referer`判断是不是`jsonp`请求, 一般不是大概, 双重保障判断一下, 如果不是方行, 恩, 方便接口测试, 也方便了网络爬虫, 代码作者:"我是`csrf防御`, 网络爬虫关我何事? " 恩, 合情合理.
* 如果请求携带`referer`则检测`domin`是不是允许的那些`domain`, 如 `bilibili.com`, 完美防御`jsonp`原理进行的跨域攻击.
* 笔者目前并未找到b站上的`jsonp`接口, 未提供`jsonp`接口依然要检测`jsonp csrf`, 可见b站的安全意识很高, 这样做的好处也是可以防止不小心在GET请求接口中做了敏感的写操作而产生的web漏洞.
* `jsonp` out.
* `cros` 跨域
![cros.PNG](https://static.studygolang.com/200514/4bc37d55938a217397cbc6c736533f7a.PNG)
* 笔者目前看到的接口都是通过`cros`简单请求的方式跨域, `api getway`同样也实现了非简单方式的跨域请求
* `cros`的`Origin`验证机制也有好好实现
* `cros`官方的跨域规范, 安全性很好, 理所应当out.
* 用户登录验证`CSRF`防御
![用户登录验证-csrf防御.png](https://static.studygolang.com/200514/0245274b981023198985cb3af7d73fe6.png)
* 笔者不解的, 这段代码应该是对盗用用户登录状态的 `cros`跨域请进行的防御, 而个人感觉`cros`的`Origin`验证机制已经很健全了呀, 双重保障?笔者知识盲区?未知的跨域攻击?
* `unknown csrf` out.
* 最后一道防御
* 良好的编码规范
* `crsf` out
### 结束
* `bilibili`的跨域攻击的应对做的很完善, 所以阿宅们大可放心, 在浏览b站时点开各种小连接, xx图(deprecated), 这些都是没问题哒
* 今日的胜负: `bilibili` 完胜
* 引用:
* 浅谈`CSRF`攻击方式:https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
* 跨域资源共享`CORS` 详解:http://www.ruanyifeng.com/blog/2016/04/cors.html
* [github](https://github.com/loop-xxx)
有疑问加站长微信联系(非本文作者))