1

次のコードは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か?

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

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,
            ),
        )
    );
}
于 2013-02-12T09:04:37.217 に答える