1

下面的代码对 SQL 注入安全吗?

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

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

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

我应该使用mysql_real_escape_string吗?

4

1 回答 1

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;
    }

附言

在使用这样的 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,
            ),
        )
    );
}
于 2013-02-12T09:04:37.217 回答