yii2之CSRF验证
来源:互联网 发布:阿里云 windows ftp 编辑:程序博客网 时间:2024/04/26 05:58
原文url:http://blog.csdn.net/xiaog351/article/details/47446687;
什么是CSRF
CSRF(跨站请求伪造),通过盗用你的身份,发送一些恶意请求,比如更改用户密码、删除账户、发送邮件、以你的身份购买商品等。
攻击原理:用户A访问网站B,登录验证通过后会在用户A的浏览器中产生登录B网站的cookie,这时用户A在没有退出登录情况下访问恶意网站C,C的网站中有去请求网站B的Request,浏览器会带着之前的cookie去请求B,而B无法分别是用户A发出的还是网站C发出的,固恶意网站C就可以模拟用户请求。
如何防止CSRF攻击
目前大多数网站都是采取服务端进行CSRF防御,就是在客户端页面增加伪随机数,服务端返回浏览器信息时setcookie添加相应字段,表单提交数据时增加隐藏字段,该字段根据cookie中的字段,进行md5、base64等处理后以隐藏的hash值post给服务器,然后服务端对表单中的hash值进行验证以确保请求是用户发送的。
攻击者攻击的原理是利用了客户端的COOKIE,但是攻击者是得不到COOKIE具体的内容的,他只是利用。所以攻击者没法在模拟攻击URL中加入token,这样就无法通过验证。
Yii2的CSRF机制
在yii2工程的environments->index.PHP下添加工程的setCookieValidationKey需要的路径。
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
在执行init时,会调用init.php中setCookieValidationKey函数根据配置的路径生成对应cookieValidationKey 32位随机串。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
该值会在Response浏览器时将cookie中的value数据通过sha256加密(cookieValidationKey是加密key)后再与value拼接作为新的value通过setcookie传给浏览器缓冲。相应代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
这样用户登录的信息就被缓冲到浏览器的cookie中。
在yii2的Request.php中有两个属性,默认都为true。
public $enableCsrfValidation = true;
public $enableCookieValidation = true;
$enableCsrfValidation是否启用CSRF验证,当设置为true时,所有表单等post提交的数据都要经过CSRF验证,如果没有经过验证将返回错误。
$enableCookieValidation是否对cookie进行验证以防止被更改。
yii2中csrf验证流程,在form表单提交数据时加上隐藏的input,name是_csrf,值从getCsrfToken获取。
<input type="hidden" name="_csrf" value="<?=Yii::$app->request->getCsrfToken() ?>">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
从上可以看出_csrf的值是通过$token和一个随机生成的$mask经过异或运算后与$mask拼接再经过base64加密后处理的一个字符串,然后看下token是从哪来的,loadCsrfToken函数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
enableCsrfCookie为true,固token是浏览器cookie中的_csrf字段值。第一次访问时是随机生成的一个32位字段
综上input中带的隐藏字段值其实就是cookie中的_csrf字段经过某种运算后的值。
表单提交给服务器后,在Controller.php的beforeAction进行验证
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
$trueToken是从cookie中获取的_csrf字段,$token为null,固通过与body中的_csrf字段(即input中提交的隐藏_csrf字段值)或者与head中的HTTP_X_CSRF_TOKEN字段进行比较。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
将input中的_csrf字段通过base64解码,然后取出前8位的$mask和后面$token然后异或得到真正的$token,用这个$token去和cookie中的token进行比较看是否相同,相同则csrf验证通过。
- yii2之CSRF验证
- yii2学习之CSRF验证
- yii2学习之CSRF验证
- 【Yii2】yii2学习之CSRF验证
- Yii2 关闭和打开csrf 验证
- yii2.0源码实现csrf验证
- yii2框架-yii2局部关闭(开启)csrf的验证(十七)
- yii2 csrf
- yii2:csrf
- yii2发送异步请求中的小问题,有效处理csrf验证
- yii2中自定义表单或者post请求 csrf验证(防跨站伪请求)
- YII2微信开发接收请求失败 关闭指定action的CSRF验证
- yii2.0的csrf问题
- YII2验证
- Yii的csrf验证
- yii的csrf验证
- Yii的CSRF验证
- Yii的CSRF验证
- android自定义view --视差动画
- 对hashCode 和 equals的理解
- 花20分钟写的-大白话讲解如何给github上项目贡献代码
- hdu 1056
- 计算机硬件
- yii2之CSRF验证
- 循环队列,队链的实现
- 机器分配 HNOI
- 关于spring的静态代理和动态代理
- Python的正则表达式
- Acvitity和Fragment通信数据显示不同步的问题
- C#跨线程调用控件最简单的写法 学习记录
- Unity学习笔记(3)-----制作一个仿真星系(复杂版)【Step3】
- python学习笔记2:面向对象的高级特性2 @property