从Yii2的Request看其CSRF防范策略(yii2-csrf-yii-request)
- 6372
- PHP
- 7
- super_dodo
- 2015/11/06
先画一幅流程图理理思路:
1. 问题是这样的:
今天在处理一个这样的需求, 在 app\controllers\LoginController.php中定义了index方法来处理登录(主要是用于非Web页面登录,比如Curl -X POST http://api/login):
结果呢, 无论是用测试工具POSTMAN还是用命令行CURL请求总是会得到 http400:Bad Request的错误;而如果用Web网页方式GET访问(去除verbFilter的POST限制),是正常的
通过帖子下面的帖子找到了问题的所在,是CSRF验证的原因;
因为Web网页访问的时候form表单中会有对应的一个隐藏input:_csrf进行了验证才可以正常进行访问;
而非网页访问方式(不通过Web表单)是无法通过csrf验证的。
而CURL访问方式都没有用到cookie, 故我认为没有必要在这里防范csrf攻击,暂时用下面的办法将其禁用。
http://stackoverflow.com/questions/23237377/yii2-curl-bad-request-400
class Controller extends \yii\base\Controller { /** * @var boolean whether to enable CSRF validation for the actions in this controller. * CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true. */ public $enableCsrfValidation = false; <- set this to false [/php] <h3>2. 趁机来研究下 Yii2 的 CSRF 防范机制</h3> 什么是 CSRF 攻击? 简单说, 攻击者盗用了你的身份,以你的名义发送恶意请求。 http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html http://baike.baidu.com/view/1609487.htm?fr=aladdin <img src="http://www.dodobook.net/wp-content/uploads/2015/11/050958512971314.jpg" alt="050958512971314" width="1052" class="alignnone size-full wp-image-2473" /> 最有效地一个方法原理是这样的: Cookie Hashing, 让服务器发送给客户端的所有表单中都标示一个随机值_csrf,并同时在客户端的COOKIE中保存一个相关联的token; 验证的时候,服务端每次对接收到的请求_POST()过来的一个input hidden _csrf跟客户端的COOKIE中的token进行对照验证 攻击者攻击的原理是利用了客户端的COOKIE,但是攻击者是得不到COOKIE具体的内容的,他只是利用(这里抛开XSS攻击的可能性,由于用户的Cookie很容易由于网站的XSS漏洞而被盗取,这就另外的1%。一般的攻击者看到有需要算Hash值,基本都会放弃了);所以攻击者没法在攻击URL中加入token,这样就无法通过验证。 这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了:> 来看看:Yii2是不是这么干的。 <h3>3. 从外到内探究</h3> Yii文档中有这么一段话是对其CSRF防范机制的概述: * When CSRF validation is enabled, forms submitted to an Yii Web application must be originated * from the same application. If not, a 400 HTTP exception will be raised. * * Note, this feature requires that the user client accepts cookie. Also, to use this feature, * forms submitted via POST method must contain a hidden input whose name is specified by [[csrfParam]]. * You may use [[\yii\helpers\Html::beginForm()]] to generate his hidden input. * * In JavaScript, you may get the values of [[csrfParam]] and [[csrfToken]] via `yii.getCsrfParam()` and * `yii.getCsrfToken()`, respectively. The [[\yii\web\YiiAsset]] asset must be registered. * You also need to include CSRF meta tags in your pages by using [[\yii\helpers\Html::csrfMetaTags()]]
3.1 先看看浏览器中的CSRF都有哪些体现:
在第一张图片中,很明显, 和
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例