CSRF
是跨站请求伪造的缩写,也被称为XSRF
, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任。
因为CSRF攻击利用的是冲着浏览器分不清发起请求是不是真正的用户本人。,也就是说,简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
cookie
。<img>
标签:<img src="http://www.examplebank.com/account=Alice&amount=1000&payfor=Badman" >
cookie
,这样浏览器发出的这个请求就能得到响应执行。危险网站可以伪造一个表单并隐藏,并在自己网站的onload
事件中,触发这个表单的提交事件,就可以改GET攻击为POST攻击
我们要防范它,先要知道它的目标,然后设法保护这些目标。
我们要明白,仅仅靠发起CSRF攻击的话,黑客只能借助受害者的cookie
骗取服务器的信任,但是黑客并不能凭借拿到cookie
,也看不到 cookie
的内容。另外,对于服务器返回的结果,由于浏览器同源策略的限制,黑客也无法进行解析。
这就告诉我们,我们要保护的对象是那些可以直接产生数据改变的服务,而对于读取数据的服务,则不需要进行CSRF
的保护。
而保护的关键,是在请求中放入黑客所不能伪造的信息。
这个方法的确可以防范一些CSRF
攻击,但是对于进阶攻击就无能为力了——POST
请求一样可以伪造。
所以这个方法不够安全。只能提高攻击的门槛。
方法:添加验证码来识别是不是用户主动去发起这个请求,由于一定强度的验证码机器无法识别,因此危险网站不能伪造一个完整的请求。
优点:简单粗暴,低成本,可靠,能防范99.99%的攻击者。
缺点:对用户不友好。
方法:在HTTP
请求头中有一个字段叫Referer
,它记录了请求的来源地址。 服务器需要做的是验证这个来源地址是否合法,如果是来自一些不受信任的网站,则拒绝响应。
优点:零成本,简单易实现。
缺点:由于这个方法严重依赖浏览器自身,因此安全性全看浏览器。
Referer
的具体实现可能有差别。Referer
可以被篡改。Referer
值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权。因此有些用户可能会开启浏览器防止跟踪功能,不提供Referer
,从而导致正常用户请求被拒绝。方法:使用token
来代替验证码验证。由于黑客并不能拿到和看到cookie
里的内容,所以无法伪造一个完整的请求。基本思路如下:
token
(比如把cookie
hash化生成),存在session
中,放在cookie
中或者以ajax
的形式交给前端。cookie
中的token
,放到请求url
里或者请求头中。token
,由于黑客无法得到或者伪造token
,所以能防范csrf
更进一步的加强手段(不需要session):
token
,然后以token
为密钥散列生成一段密文token
和密文都随cookie
交给前端token
都交给后端token
和密文进行正向散列验证,看token
能不能生成同样的密文token
也无法拿到密文。优点:
缺点:
hash
计算,增加性能上的成本cookie
臃肿:更加依赖网络的情况token
,这样黑客可以在自己的网站上得到这个 token
,并马上就可以发动CSRF攻击。(进一步加强法可以防范,或者验证链接是否是链到自己本站的,是就在后面添加 token
,如果是通向外网则不加)cookie
和token
,当然这不在本文的讨论范围之内。token
附在请求中。(可以通过框架和库解决)方法:这种方法也是使用token并进行验证,和上一种方法不同的是把它放到HTTP头中自定义的属性里。
优点:
缺点:
因为CSRF攻击利用的是冲着浏览器分不清发起请求是不是真正的用户本人,所以防范的关键在于在请求中放入黑客所不能伪造的信息。从而防止黑客伪造一个完整的请求欺骗服务器。
2024 - 快车库 - 我的知识库 重庆启连科技有限公司 渝ICP备16002641号-10
企客连连 表单助手 企服开发 榜单123