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