2013-02-10 18 views
1

以下代碼是否對SQL注入安全?是CDbCriteria Secure中的「order」屬性?

$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

+0

你使用CGridView來呈現數據的情況下? – dr0zd 2013-02-12 08:36:05

+0

不,我正在使用ExtJs。但我不認爲CGridView可以有所作爲。 – 2013-02-12 12:19:02

回答

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