什么是CSRF攻击?
CSRF攻击是通过强制用户登录到攻击者控制的账户来策划的。为了达到这一目的,黑客使用他们的凭证向网站伪造一个状态改变请求,并将表单提交到受害者的浏览器。服务器对浏览器请求进行身份验证,并将用户登录到攻击者的账户。当受害者向攻击者的账户提交正在登录的敏感信息时,攻击者可以利用这些信息执行一些不必要的操作,包括身份盗窃。
有哪些攻击原理?
CSRF一般的攻击原理是,攻击者向目标网站注入一个恶意的CSRF攻击URL地址(跨站url),当(登录)用户访问某特定网页时,如果用户点击了该URL,那么攻击就触发了,我们可以在该恶意的url对应的网页中,利用来向目标网站发生一个get请求,该请求会携带cookie信息,所以也就借用了用户的身份,也就是伪造了一个请求,该请求可以是目标网站中的用户有权限访问的任意请求。也可以使用javascript构造一个提交表单的post请求。比如构造一个转账的post请求。
所以CSRF的攻击分为了两步,首先要注入恶意URL地址,然后在该地址中写入攻击代码,利用等标签或者使用Javascript脚本。
那么,该如何防御CSRF攻击?
1.尽量使用POST,限制GET
GET接口太容易被拿来做CSRF攻击,只要构造一个img标签,而img标签又是不能过滤的数据。因此,接口最好限制为POST使用,GET则无效,降低攻击风险。
当然POST并不是万无一失,攻击者只要构造一个form就可以,但需要在第三方页面做,这样就增加暴露的可能性。
2.浏览器Cookie策略
IE6、7、8、Safari会默认拦截第三方本地Cookie(Third-partyCookie)的发送。但是Firefox2、3、Opera、Chrome、Android等不会拦截,所以通过浏览器Cookie策略来防御CSRF攻击不靠谱,只能说是降低了风险。
Cookie分为两种:一种是SessionCookie(在浏览器关闭后,就会失效,保存到内存里);另一种是(即只有到了Exprie时间后才会失效的Cookie,这种Cookie会保存到本地)。
另外如果网站返回HTTP头包含P3PHeader,那么将允许浏览器发送第三方Cookie。
3.加验证码
验证码,强制用户必须与应用进行交互,才能完成最终请求。在通常情况下,验证码能很好遏制CSRF攻击。但是出于用户体验考虑,网站不能给所有的操作都加上验证码。
因此验证码只能作为一种辅助手段,不能作为主要解决方案。
3.RefererCheck
RefererCheck在Web最常见的应用就是“防止图片盗链”。同理,RefererCheck也可以被用于检查请求是否来自合法的“源”(Referer值是否是指定页面,或者网站的域),如果都不是,那么就极可能是CSRF攻击。
因为服务器并不是什么时候都能取到Referer,所以也无法作为CSRF防御的主要手段。但用RefererCheck来监控CSRF攻击的发生,倒是一种可行的方法。
5、AntiCSRFToken
现在业界对CSRF的防御,一致的做法是使用一个Token(AntiCSRFToken)。
每一个网页包含一个webserver产生的token,提交时,也将该token提交到服务器,服务器进行判断,如果token不对,就判定位CSRF攻击。
这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。