yii的ar带安全过滤不?我直接把get变量给ar当条件安全不?

yii的ar带安全过滤不?我直接把get变量给ar当条件安全不?

请问yii底层有哪些安全过滤机制?以前用的ci是把get和post都销毁转成安全的变量,ar也会过滤一次。

没人回答啊?我也在研究

我看了一下CHttpRequest这个类,发现有过滤!


/**

	 * Normalizes the request data.

	 * This method strips off slashes in request data if get_magic_quotes_gpc() returns true.

	 * It also performs CSRF validation if {@link enableCsrfValidation} is true.

	 */

	protected function normalizeRequest()

	{

		// normalize request

		if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())

		{

			if(isset($_GET))

				$_GET=$this->stripSlashes($_GET);

			if(isset($_POST))

				$_POST=$this->stripSlashes($_POST);

			if(isset($_REQUEST))

				$_REQUEST=$this->stripSlashes($_REQUEST);

			if(isset($_COOKIE))

				$_COOKIE=$this->stripSlashes($_COOKIE);

		}


		if($this->enableCsrfValidation)

			Yii::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));

	}




	/**

	 * Strips slashes from input data.

	 * This method is applied when magic quotes is enabled.

	 * @param mixed $data input data to be processed

	 * @return mixed processed data

	 */

	public function stripSlashes(&$data)

	{

		return is_array($data)?array_map(array($this,'stripSlashes'),$data):stripslashes($data);

	}

以上应该是过滤的代码

直接用$_GET[‘xxx’]就没法过滤了吧,你说的这个怎么用啊?


 if(isset($_GET)) 

         $_GET=$this->stripSlashes($_GET);

今天又看了手册,发现之前的用法已经淘汰了。

没必要直接得到get数据。

我之前是依照那个blog demo做的,过时了。按照正确的做法应该没有安全问题了。

你的这个帮了我大忙了 :D

都是小白,小白也有价值,呵呵。

注意:Yii是不对$_GET或$_POST进行过滤的,因为这意味着不可逆的数据更改。Yii依赖于model的验证规则对数据进行验证及过滤。

为了防止XSS和SQL injection攻击,应该完全避免直接在SQL和HTML里嵌入$_GET或$_POST变量。

应该使用parameter binding和HTML encoding。

学习了,以前有很多没有用parameter binding的

->find(‘name = ?’, array($username);

这一种方式是属于parameter binding方式吗?

那么请问qiang哥,这样安全不?其中$category_id是get变量




         public function actionCategory($category_id){

	    

	    $category_id=(int)$category_id;


	    $params = array('category_id = '.$category_id);

	    $criteria->addCondition($params);




            $dataProvider=new CActiveDataProvider('Item', array(

                'criteria'=>$criteria,

            ));

	    

            $this->render('index', array(

                'dataProvider' => $dataProvider,

            ));

	}



其实就是问:$criteria->addCondition() $criteria->addSearchCondition() 之类的方法会不会对传入的变量进行安全检测?

就楼上这段代码是没有问题的,因为你把 $category_id 强制转为 int 类型了,但如果是 string 类型而直接连接到 SQL 的 condition 里就有可能有问题了。

参用 CDbcriteria 的说明。

我提到了两个问题:一是SQL Injection攻击,一个是XSS攻击。

对于前者,需要避免的是直接把用户输入嵌入到SQL里,例如:“SELECT * FROM tbl_user WHERE id={$_GET[‘id’]}”。

恶意用户可以让$_GET[‘id’]等于"1; DELETE FROM tbl_user",这样就把所有的用户数据都删除了!非常危险!

解决办法有好几种。最简单的就是用param binding,请阅读PHP PDO获得相关知识。如果知道id是整数,也可以先把输入强制为整数。或者如果id是字串,可以用CDbConnection::quoteValue()把输入加上引号。如果你用的是AR,那么save()函数自动会使用param binding。如果你用findAll()之类的函数,自己生成condition部分,那就要特别小心不要直接嵌入输入。

XSS攻击主要是要避免直接显示用户的输入数据。例如echo $user->description(假设description的数据来自用户的输入)。恶意用户可以让id为一段js代码,使得其它用户查看该页面后隐式执行该代码,从而被恶意用户获得登录cookie等安全信息。

解决办法很简单,就是用CHtml::encode()。如果输入是HTML,可以用CHtmlPurifier::purify()来过滤有害代码。

好了,qiang哥已经说的很清楚了,再不懂就天理不容了。多谢热心回复。

这篇贴子应该收藏…… :rolleyes:

好帖子! 安全的必修课