安全CSRF

Posted 神仙朱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安全CSRF相关的知识,希望对你有一定的参考价值。


后面会把前端进阶的课程内容都总结一遍。有些都是很常见的知识,但是为了梳理自己的知识树,所以尽量模糊的地方都会记录


今天需要记录的是另一大安全知识点 CSRF,是一个非常常见的安全问题

对于我们前端来说,也是必须要掌握的,因为面试会问啊~

好吧,今天需要记录的下面几块内容

1、CSRF 简介

2、CSRF 攻击原理

3、CSRF 防御措施



CSRF 简介

英文全称,Cross Site Request Forgery

中文翻译,跨站请求伪造

按照翻译,已经能理解他做什么事情了

1、跨站。在另一个网站上进行攻击操作

2、请求伪造。假冒用户操作,携带用户信息,伪造请求


CSRF 和 XSS

CSRF 个人感觉一定程度上感觉属于 XSS

CSRF 攻击载体是 请求,XSS攻击 载体是 恶意脚本,CSRF 能做的,XSS 都能做。

所以我感觉 CSRF 属于 XSS,但是他们攻击载体不一样,而且显然CSRF 比 XSS 成本更低,并且难以防范

所以我想这就是他们作为两种安全漏洞存在的原因之一把



CSRF 攻击原理

攻击重点就是,劫持用户的 Cookie


怎么劫持的呢??

【安全】CSRF

下面我们先说个场景

比如现在你有个贴吧账户其中发帖的接口是 http://a.com/addPost

参数 content 是 帖子的内容

如果你发帖内容是 xxx,就会这么请求,http://a.com/addPost?content=xxx

但是这个接口需要携带登录后的 cookie 才能调通,所以你肯定是需要登录的


下面开始攻击步骤

1、你登录了贴吧,服务端返回 cookie,保存在浏览器端

2、有人给你发了一个网站链接 b.com,在这个网站中,调用了发帖接口,内容是 xxxx

3、你手贱,点开了链接,因为你没有退出登录 a.com,b.com 中 就会携带你的 cookie 调用 发帖接口

4、a.com 服务端收到 带有 cookie 的发帖请求,认为是你发送的,那么帖子发送成功,攻击也就成功了


看了上面的步骤,其实还是有一个问题

在 b.com 调用 a.com 的接口,怎么会携带上 a.com 的 cookie?cookie 不是不能跨域访问吗?

没错,的确不能跨域访问,如果你直接在 b.com 中 使用 ajax 请求接口,的确不会携带上 cookie,如下

【安全】CSRF


但是一样有方法,就是利用 script ,img,iframe 等不受同源策略影响的标签对 接口进行请求

比如上面的发帖接口,只要你在 b.com 中加入 img 标签,如下

<img  src="http://a.com/addPost?content=xxx" />

那么这个img 发起的请求,就会把你的 cookie 给带走

【安全】CSRF


也许你又会问,img 那些只能发 get 请求啊,那 post 请求怎么办?

不用怕,一样可以!!答案就是!!

在 b.com 的页面中,建立表单提交!

【安全】CSRF


然后控制他自动提交就可以了



CSRF 防御措施

上面我们已经讲了攻击的原理了,我们可以绕过同源策略,携带用户cookie伪造请求,冒充用户操作

所以我们必须想出办法来杜绝 CSRF ,不然整天被人假冒

既然是防御,我们就要从他是攻击的特点开始入手

1、跨站

2、利用 cookie 伪造请求

3、隐性请求,用户不知情


针对 CSRF 攻击的 三大特点来逐个击破


1防止跨站

既然他是在别的站点进行请求的发送,那么我只要识别这个请求的来源不就行了?

没错,我们可以获取到请求从哪个网站发起的


怎么获取?

【安全】CSRF


所以我们只要拿到 请求头的 referer 信息,验证是否是从我站发起请求,然后才决定是否响应操作

当然这个验证是由服务端完成的,前端只能看戏

【安全】CSRF

比如你从 b.com 发起 a.com/addPost 的 请求,那么请求的 referer 就是 b.com

如果服务端判断 你的 referer 不是 a.com ,那你特么肯定是想攻击我的用户啊,不答应!

告诉黑客


但是这种方法其实还是不太安全,因为黑客甚至可以篡改 Referer 的值。

并且有些用户为了隐私,会设置浏览器不发送 Referer 字段,这样的话,正常操作也会被当成 CSRF 了

所以这种方法没有得到推广


2防止利用cookie伪造请求

CSRF 得逞的原因是什么!??

没错,就是利用 cookie 会随着请求一起发送的基础上,假冒我们去进行操作

所以,我们不用 cookie 不就行了??

cookie 是用来验证登录的,如果不用 cookie 用什么呢?

那就是!我们自己用算法生成一个 token

当用户登录的时候,就给他返回一个 token,然后用户的任何操作都需要带上 token 这个参数

比如登录之后我们的token 是 xxxx,然后我们发帖就会这么发送

http://a.com/addPost? content=xxx & token = xxxx

这个方法是现在最主流最有效的防御 CSRF的方法,因为我们的 token 算法是不公开的,所以

黑客无法计算出 token,并且跨站请求也无法自动携带 token 

所以任何跨站的操作都不攻自破


3防止用户不知情

黑客利用跨站请求 假冒用户,一切都是在用户不知情的情况下的

用户不知情下发帖,用户不知情下转账,然后才会默认了请求的发生

那我们让用户知情不就行了?

比如在发帖的时候,需要输入验证码来确认操作

只有验证码正确了,才响应操作而 CSRF 是无法知道验证码是什么,所以跨站的请求是肯定不会成功了

但是如果任何操作都需要验证码,用户体验也是非常糟糕而来,所以通常我们只会在重要的操作下才会需要输入验证码

比如涉及到金钱,用户安全等等的操作



总结

利用 CSRF 攻击的特点,我们得出了三种防御方式

1、防止跨站,就是 Referer 验证 

2、防止利用 Cookie 伪造请求,就是 Token 验证

3、防止用户不知情,就是 验证码验证

所以我们有三种防御的方法,但是在实际情况下我们的防御通常不可能只选择某一种,而是多种方法一起使用,层层保护

比如服务端在处理请求的时候

1、先判断 referer 来过滤一些低级的 CSRF 攻击

2、然后使用 token 来重点防御 CSRF

3、接着在重要的操作下,使用验证码验证用户




最后

鉴于本人能力有限,难免会有疏漏错误的地方,请大家多多包涵, 如果有任何描述不当的地方,欢迎后台联系本人,领取红包

以上是关于安全CSRF的主要内容,如果未能解决你的问题,请参考以下文章

44. CSRF 攻击与防御

前端安全-XSS和CSRF

了解一下前端安全知识:XSS和CSRF

WEB前端安全——XSS和CSRF

CSRF Double Submit Cookie 基本上是“不安全的”

从Java代码实现角度探讨CSRF(采用全局的token)