关于CSRF

一、什么是csrf


CSRF from 百度百科

CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

其实是2个原因导致了风险的出现:

  1. 为了提高用户的体验,很多网站会在用户的本地存放用户的标示,一般是在浏览器的cookie里存放。这样用户第一次登录过网站后就不用再次登录,甚至在关机后再次打开就可以与后台发起交易,不需要再次验证身份。有人问,如果我的电脑不给人使用就我自己使用,那么是不是在享受方便之余并不损失安全性呢?那么请看2.
  2. 我们可以称第一步的网站为网站A。那么如果你访问了恶意网站B,而网站B里插入了一段直接post到网站A的form(或带有了一个直接请求网站A的url),此时你如果不小心点到了,那么浏览器会去执行表单,同时如果浏览器执行表单的时候会带上你之前留下的cookie,于是灾难发生了。还有人说,如果我少去上xx网站是否就安全了,其实还不是,因为比如以前的论坛等网站可能可以贴js代码,或者带url请求的图片等,那个时候你可能还是可能中招。

作为程序员,我们怎么让自己的应用免受csrf攻击呢?

  1. 去掉cookie自动登录,不让用户方便!ok,这个会被骂的,pass。
  2. 对请求增加一个随机数,这个随机数是第三方不能轻易伪造的。浅谈CSRF攻击方式 在这里面提供了3种方式,都是个思路。其实我认为靠谱的还是第一种,django也是这种方式。下面来看django来如何抵御csrf攻击。

二、django怎么抵御csrf攻击


原文

1. 应用自身做到get请求是无副作用的(side-effect free)

什么是无副作用呢?

我理解是就算是可以请求到结果,也不会带来损失。最基本的也就是不会修改用户的数据。一般遵循http的语义的都会做到这点。如果一些敏感数据不能让人查询到的应该也最好不用get请求来做,举个例子就是对应银行网站,查询用户的基本信息包括余额、交易记录等应该都属于机密信息,那么django去做银行应用的时候,大部分请求都不能是get请求。

嗯,你懂了?也就是django不保护get请求抵御csrf攻击。自求多福!

2. post请求靠增加csrf_token来抵御csrf攻击

在post请求的表单中,增加一个csrf_token的字段,该字段隐藏并填写上内容(隐藏了就不影响用户体验)。后台服务会验证这个字段,那么第三方的恶意网站因为无法伪造这个隐藏字段的内容,所以也就能够保证安全。

在细节实现上,django并不是把这个隐藏字段存在db,然后每次和db检查,或者是每个请求都随机生成一个内容,同时保存起来验证等等。django是在第一次访问(get请求)的时候在cookie里加入了csrf-token,然后post请求过去时,他就直接检查form表单里的csrf-token是否和cookie里的csrf-token一致的。

所以django的csrf抵御也是依赖于cookie来做到的。那么cookie是否100%安全呢?那就不清楚了。

3. ajax

django单独将了一章节说ajax怎么处理,其实主要是因为每次post请求都增加一个csrf-token会有些麻烦,于是他建议你写到header里去。

4. django对付csrf是否100%安全?

99%

为何这么说呢?因为cookie也不是100%安全吧。

三、移动应用有无csrf风险?


我们翻回去再看下第一、二章。

第一个问题:cookie该为csrf负责么?

cookie给用户带来方便的同时也引入了风险。但我不认为cookie要为csrf攻击负责,因为实际上从django的实现可以看到抵御csrf攻击的cookie还是起到了很大的作用。

第二个问题:网站A该为csrf负责么?

是的。因为他做好了防范,那么就没有危害了。

第三个问题:浏览器在该为csrf负责么?

是的。浏览器在csrf攻击中,错误的在访问恶意网站B的时候,允许提交表单至网站A,且同时带上了网站A的cookie,从而使攻击者不需要窃取网站A的cookie,转而利用浏览器“借用”了网站A的cookie。

第四个问题:移动应用是否存在csrf风险?

对比移动应用,移动应用也会为了提高用户体验将很多用户的信息缓存下来,存放的位置一般来说不同于浏览器的cookie,以iOS为例,可能是UserDefauts、SQLite、CoreData,那么这些都是别的应用无法访问的(这个由iOS保证),所以别的应用无法类似向对待浏览器一样来发起攻击。当然,移动应用也可以在本机的cookie里存放用户信息,那么此时如果本机的浏览器会存在问题3中提到的,那么一样需要考虑csrf攻击。