今天看了一下yii2.0 和之前1.x的版本比较改变了很多地方,具有防止 SQL 注入, XSS 攻击, CSRF 攻击, cookie 窃取等,今天特意研究了一下YII2.0防csrf攻击。首先看一下csrf攻击的原理,如下图:
http://www.o-xx.com/wordpress/?p=16
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
上图是csrf攻击的简单原理,根据这个原理可以知道攻击者B不能拿到web A埋在user C中的cookie,那么就简单了,在user C访问web A时,web A在user C 的浏览器中埋下一个cookie,同时在post提交信息的地方放一段token,user C post 提交表单时,同时将token值提交到web A的服务器,web A将token值和user A的cookie做关联性的验证,验证真实性,这样就能知道是否是由user A 来提交的表单了。
那么在yii2.0中是怎么做的呢?
首先我们看一下yii2.0渲染的html页面和form表单,
上面第二张图可以看到,yii2.0在渲染html页面时,会生成一端meta信息来保存csrf_tonken,在渲染form表单是,会在表单内生成一段hidden 的input 用来保存csrf_tonken。
那么如果我想用ajax 来post数据,或者flash post数据可以吗?答案是NO,会报400错误。
那么如ajax和flash如何来进行post数据呢,有两个方法,第一个方法就是在config\web.php中关闭csrf验证,如下图,设置’enableCsrfValidation’ => false,这样就关闭立刻csrf验证。
第二个方法就是获取页面中的meta name为csrf-token 的content,在该值作为参数 _csrf的值和其他数据一起post到服务器,如下图: