CSRF 攻击是什么?如何防范?

CSRF

CSRF(Cross-site request forgery,跨站请求伪造),是一种网络攻击方式。也被称为:one click attack/session riding,缩写为:CSRF/XSRF。简单来说,也就是伪造你的身份向第三方网络发送请求,包括伪造邮件,盗刷银行卡,银行转帐的行为,就是平行空间中出现了一个假的你,他可以随意花你的钱刷你的卡....


vevb.jpg

CSRF套路原理

要完成一次CSRF攻击,受害者必须依次完成两个步骤 :

1.one登录受信任网站A,并在本地生成Cookie 。
2.one在不退出A的情况下,访问危险网站B。
3.危险网站B上有一个标签:
4.这个标签的src不指向一张图片,而是一个http请求,这个请求向银行要求将Alice的1000元转给Badman,由于one的浏览器上有cookie,这样浏览器发出的这个请求就能得到响应执行。这样one的钱就被偷了。


gf3.jpg

CSRF攻击主要是因为Web的隐式身份验证机制,Web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该是不是来自于用于本人,所以在防范CSRF攻击时,我们需要防范的关键点是在请求中放入黑客不能伪造的信息。

CSRF防范

1,最基础的防范就是在Get与Post区别的文章中有说过,Post请求要比Get更为安全,但是这不能完全避免被攻击,只能说会Pass一些低级攻击选手。l
2,生活中最常见的对应方法,验证码机制。添加验证码来识别是不是用户主动去发起这个请求,由于一定强度的验证码机器无法识别,因此危险网站不能伪造一个完整的请求。
优点:简单粗暴,低成本,可靠,能防范99.99%的攻击者。
缺点:对用户不友好。
3,请求来源限制——验证 HTTP Referer 字段
方法:在HTTP请求头中有一个字段叫Referer,它记录了请求的来源地址。 服务器需要做的是验证这个来源地址是否合法,如果是来自一些不受信任的网站,则拒绝响应。
优点:零成本,简单易实现。
缺点:由于这个方法严重依赖浏览器自身,因此安全性全看浏览器。

兼容性不好:每个浏览器对于Referer的具体实现可能有差别。
并不一定可靠:在一些古老的垃圾浏览器中,Referer可以被篡改。
对用户不友好:Referer值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权。因此有些用户可能会开启浏览器防止跟踪功能,不提供Referer,从而导致正常用户请求被拒绝。
额外验证机制——token的使用
方法:使用token来代替验证码验证。由于黑客并不能拿到和看到cookie里的内容,所以无法伪造一个完整的请求。基本思路如下:

服务器随机产生token(比如把cookie hash化生成),存在session中,放在cookie中或者以ajax的形式交给前端。
前端发请求的时候,解析cookie中的token,放到请求url里或者请求头中。
服务器验证token,由于黑客无法得到或者伪造token,所以能防范csrf
更进一步的加强手段(不需要session):

服务器随机产生token,然后以token为密钥散列生成一段密文
把token和密文都随cookie交给前端
前端发起请求时把密文和token都交给后端
后端对token和密文进行正向散列验证,看token能不能生成同样的密文
这样即使黑客拿到了token 也无法拿到密文。

优点:
安全性:极大地提高了破解成本(当然还是有办法破解),但是99%的攻击者看到散列的时候就已经望而生畏了。
易用性:非常容易实现。
友好性:对用户来说十分友好。

缺点:
性能担忧:需要hash计算,增加性能上的成本
cookie臃肿:更加依赖网络的情况
并不绝对安全:
一些论坛之类支持用户自己发表内容,由于系统也会在这个地址后面加上token,这样黑客可以在自己的网站上得到这个 token,并马上就可以发动CSRF攻击。(进一步加强法可以防范,或者验证链接是否是链到自己本站的,是就在后面添加 token,如果是通向外网则不加)
其他攻击方式如XSS攻击能拿到cookie和token,当然这不在本文的讨论范围之内。
对于POST请求,难以将token附在请求中。(可以通过框架和库解决)

曲线救国——在HTTP头中自定义属性并验证
方法:这种方法也是使用token并进行验证,和上一种方法不同的是把它放到HTTP头中自定义的属性里。

优点:
这样解决了上种方法在请求中加入 token 的不便
通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,安全性较高

缺点:
局限性非常大:XMLHttpRequest请求通常用于Ajax,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,造成不便。
对于旧网站,要把所有请求都改为XMLHttpRequest请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。
该部分说明参考来源于慕课网。

你可能感兴趣的:(CSRF 攻击是什么?如何防范?)