CSRF是Cross Site Request Forgery的缩写,中文是跨站点请求伪造;接下来将和大家分享这种攻击的原理、实施的方法、以及防御的几种方案;
通过在恶意网站部署好攻击代码和相关数据,然后引导目标网站的已经授权的用户进入恶意网站,由于浏览器已经获得了目标网站的用户授权票据,因此恶意网站就可以执行“事先”部署好的代码向目标网站提交数据使目标网站执行一些写的操作,比如删除目标网站的数据、向目标网站提交垃圾数据等,然而这个过程是在后台默默执行的,用户毫不知情。
举个例子说明一下吧:
假设www.t.com是目标网站,有一个页面www.t.com/blog/delete.aspx?id=123 是删除ID为123的博文操作;
那么攻击者就可以在恶意网站www.a.com/csrfpage.aspx页面部署下面的代码:
<form id=”csrffrm” action=”http://www.t.com/blog/delete.aspx” target=”hideiframe”><input name=”id” type=”hidden” value=”123″ /></form>
<iframe name=”hideiframe” style=’display:none’></iframe>
<script>
document.getElementById(“csrffrm”).submit();
</script>
然后狡猾的攻击者就可以通过各种方式吸引已经成功登陆www.t.com的用户点击进入www.a.com/csrfpage.aspx页面,最后恶意代码被执行,用户的博文ID为123的文章在不知不觉中被攻击者删除了
根据上面的原理可以看出要实施CSRF攻击需要满足下面几个条件:
一、需要了解目标系统的目录和相关参数名称,其实要满足这个条件并不困难,攻击者通过相关的“系统目录彩虹表”进行检测又或者攻击者本身也是目标系统的用户之一,那么了解目标系统就更容易了;
二、需要一个执行恶意代码的网站,这个网站有可能是攻击者事先部署好的网站,或者恶意网站存在XSS漏洞刚好被攻击者利用;
三、需要目标系统的用户登录并且获得了合法的操作权限,同时用户被诱惑进入了恶意的网站;
要实施CSRF攻击要满足这三个条件,由于这些条件并不是那么容易被满足,所以比较容易被开发者所忽略。
1.使用验证码
记得之前的12306网站上每次查票都要输入恶心的验证码,之所以要设计这个验证码它的目的是为了防止机器刷票,当然也能有效的预防CSRF攻击,但是如果每个操作都要用户输入验证码用户可能会崩溃掉,用户体验效果非常的不好;
2.检查Referer(来源)
除了验证码还可以检查Referer是否来自于同一个源,如果Referer是同源的那么这个操作是可信的,这个方法通常用于防止图片盗链,但是有些时候Referer并不是那么的可靠,服务器并不是能够百分之百的获得,比如如果用户启用了浏览器的隐私策略那么浏览器就有可能阻止发送Referer,服务器就有可能无法获取到这个值,所以这个方式不符合科学严谨的原则;
3.使用token(随机令牌)
服务器生成一个随机令牌,并保存起来,可以保存在服务端的session集合里边,或者保存在客户端的cookie、或者页面视图状态中都是可以的,由于浏览器的同源策略,恶意网站无法读取到目标网站的cookie和页面视图状态,然后把随机令牌随表单一起提交并在服务端验证随机令牌的有效性;