以下代码是否可以防止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
吗?
答案 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,
),
)
);
}