CSRF的原理和防范措施

a)攻击原理:

i.用户C访问正常网站A时进行登陆,浏览器保存A的cookie
ii.用户C再访问攻击网站B,网站B上有某个隐藏的连接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数
iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookie
iv.因此网站A在接收到请求以后可判断当前用户是登陆状态,因此根据用户的权限作具体的操做逻辑,形成伪形成功

b)防范措施:

i.在指定表单或者请求头的里面添加一个随机值作为参数
ii.在响应的cookie里面也设置该随机值
iii.那么用户C在正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面的随机值,那么服务器下次接受到请求以后就能够取出两个值进行校验
iv.而对于网站B来讲网站B在提交表单的时候不知道该随机值是什么,因此就造成不了攻击

个人理解:搞清楚三个点 

一、什么是csrf?(cross-site request forgery)简称跨站请求伪造,首先要搞明白它是一种行为,什么行为?
伪造你的请求的行为。

简单来讲就是: 你访问了信任网站A,而后A会用保存你的我的信息并返回给你的浏览器一个cookie,而后呢,在cookie的过时时间以内,你去访问了恶意网站B,它给你返回一些恶意请求代码,要求你去访问网站A,而你的浏览器在收到这个恶意请求以后,在你不知情的状况下,会带上保存在本地浏览器的cookie信息去访问网站A,而后网站A误觉得是用户自己的操做,致使来自恶意网站C的攻击代码会被执行:发邮件,发消息,修改你的密码,购物,转帐,偷窥你的我的信息,致使私人信息泄漏和帐户财产安全受到威胁。

二、如何解决?在post请求时,form表单或ajax里添加csrf_token(实际项目代码里就是如此简单)
解决原理:添加csrf_token值后,web框架会在响应中自动帮咱们生成cookie信息,返回给浏览器,同时在前端代码会生成一个csrf_token值,而后当你post提交信息时,web框架会自动比对cookie里和前端form表单或ajax提交上来的csrf_token值,二者一致,说明是当前浏览器发起的正常请求并处理业务逻辑返回响应,那么第三方网站拿到你的cookie值为何不能经过验证呢,由于他没你前端的那个随机生成的token值啊,他总不能跑到你电脑面前查看你的浏览器前端页面自动随机生成的token值吧。
注意:你打开浏览器访问某个url(页面),默认是get请求,也就是说,你只要访问了url,对应的视图函数里只要不是if xx == post的逻辑就会执行,因此你打开页面,他会先生成cookie(token)值,返回给浏览器,而后你提交表单,或者发ajax请求时,会将浏览器的cookie信息(token值)发送给服务器进行token比对,这个过程相对于你发起了两次请求,第一次是get,第二次才是post,搞清楚这个,你才能明白csrf_token是怎么比对的。