CSRF是什么?
跨站请求伪造(英语:Cross-site request forgery),维基百科的解释是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法,听起来很厉害的样子。
简单来说,攻击者利用一些技术手段去欺骗用户浏览器去访问一些曾经认证过的网站而执行一些操作。由于认证过,所以浏览器认为是用户的本意。
其实咋们可以简单理解为虎符调兵
,正常是大将军颁发虎符才能调兵,但是军队只认虎符不认人,假如奸臣偷取虎符假传命令私自调兵造反,那可就大事不好!
CSRF原理
那我们具体看看攻击细节
[图片上传失败...(image-cabdc9-1515149841622)]
看图说话
大致过程
- 用户访问浏览正常网站
- 正常网站服务器响应并且返回标识该用户身份的cookie
- 用户未注销正常网站的情况下,访问恶意网站
- 恶意网站里访问正常网站并且带着标识用户的cookie
- 正常网站服务器接受来自恶意网站的请求
再次访问正常网站时,浏览器会自动带上标识该用户身份的cookie发送请求,所以正常网站服务器会接受来自恶意网站的请求,从而完成攻击。
当我访问登录一个正常网站,成功访问后服务器会产生一个标识用户身份的cookie给用户的浏览器保存,在标识cookie还存在时访问恶意网站,在该网站里攻击者会让你不知不觉的访问之前的正常网站并且执行一些操作,由于标识用户身份的cookie还存在,所以用户浏览器认为是用户的本意操作而执行该请求,从而攻击成功。
这些欺骗的访问方式有很多,例如“点击小广告、找回密码”等等诱导用户去点击操作。
如何预防CSRF
我去,感觉都不敢上网冲浪了。。。
其实现在浏览器和服务端都做了很多安全防范措施,大家还是可以安全上网的。
目前预防方式有二种:
-
检查Referer字段
HTTP请求head里有个Referer字段,用于表明请求的来源地址。
正常情况下,Referer字段和请求的地址是位于同一域名下的,
如果是CSRF攻击发起的请求,那么Referer字段和请求的地址就不是同一域名了,那么服务器就能识别出恶意访问。这个方法缺点是攻击者有可能篡改该Referer字段内容,从而欺骗服务器。
-
添加校验token
当用户正常访问网站时,服务器会生产一个随机数,并且把该随机数埋入该页面里(一般放在form表单,
<input type="hidden" name="_csrf_token" value="xxxx">
)。正常访问,客户的浏览器是能够得到并且返回该字段,而CSRF一开始是不知道该字段的数值,服务器接受请求发现该字段的异常,从而拒绝该请求。
参考资料