CDbCriteria中的“订单”属性是否安全?

时间:2013-02-10 08:15:51

标签: yii

以下代码是否可以防止SQL注入?

$criteria = new CDbCriteria();
$arySort= json_decode($_GET['sort']);
$criteria->order= $arySort[0]->property . ' ' .  $arySort[0]->direction;

Person::model()->findAll($criteria);

如果没有,我该怎么做才能确保CDbCriteria对象的“order”属性没有危险?

我应该使用mysql_real_escape_string吗?

1 个答案:

答案 0 :(得分:0)

我认为这并不是只考虑sql注入。您必须检查来自json数组的数据,可能会发送错误的字段名称或错误的方向。

所以

    $criteria = new CDbCriteria();
    $arySort= json_decode($_GET['sort']);
    $criteria->order=$this->prepareSort($_GET['sort']);
    Person::model()->findAll($criteria);

    public function prepareSort($arySort)
    {
        $property='t.id';
        $direction='ASC'
        if(is_seet($arySort[0])
        {
            if(in_array($arySort[0]->property, array_keys($this->attributes))
                $property=$arySort[0]->property;
            if(in_array($arySort[0]->direction, array('ASC', 'DESC')))
                $direction=$arySort[0]->direction;
        }
        return $property.' '.$direction;
    }

PS

在使用像这样的CGridView的情况下

public function search()
{
    $criteria=new CDbCriteria;

    $criteria->compare('t.id',$this->id);
    $criteria->compare('t.title',$this->title,true);
    $criteria->compare('content',$this->content,true);
    $criteria->compare('url',$this->url,true);

    return new CActiveDataProvider(
        $this,
        array(
            'criteria'=>$criteria,
            'sort'=>array(
                'defaultOrder'=>'title ASC',
                'attributes'=>array(
                    '*'
                )
            ),
            'pagination'=>array(
                'pageSize'=>20,
            ),
        )
    );
}