一、CSRF攻击原理
从上图可以看出,要完成一次CSRF
攻击,受害者必须依次完成两个步骤:
1.登录受信任网站A,并在本地生成Cookie
2.在不登出A的情况下,访问危险网站B
注:
- 如果不满足以上两个条件中的一个,就不会受到
CSRF
的攻击 - 网站B向网站A发送请求时,如果网站A在打开状态下,那么该请求会携带网站A页面下的
cookie
(待验证) CSRF
攻击是以突破同源策略限制为前提的
二、示例
银行网站A:它以GET请求来完成银行转账的操作,如:
1 | http://www.mybank.com/Transfer.php?toBankId=11&money=1000 |
危险网站B:它里面有一段HTML的代码如下:
1 | <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000> |
首先,你登录了银行网站A,然后访问危险网站B,噢,这时你会发现你的银行账户少了1000块……
三、CSRF防御
1、Cookie Hashing
所有表单中,生成一个隐藏域 ,它的值就是Cookie
中的token
。
注:CSRF
能模拟请求,不能跨域读取cookie
。如果cookie
已经被xss
攻击,还是很危险。
2、检查Referer字段
HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。
注:http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。
3、使用JSON格式
使用JavaScript
发起AJAX
请求是限制跨域的,并不能通过简单的 <form>
表单来发送JSON
,所以,通过只接收JSON
可以很大可能避免CSRF
攻击。
注:CORS
规范中对跨域访问资源规定了明确的限制