Как я могу защитить исходное SQL-условие CDbCriteria (анти-SQL-инъекция) в Yii 1.1? - PullRequest
0 голосов
/ 26 апреля 2018

Я имею дело с приложением Yii 1.1.

Часть метода поиска использует CDbCriteria и raw sql.

Мне было интересно, как я все еще могу использовать необработанный SQL-код и сделать его более защищенным от SQL-инъекций?

Вот пример кода:

if (!empty($this->textToSearch)) {
    $text_condition = <<<EOC
(
    topic LIKE "%{$this->textToSearch}%" OR
    main LIKE "%{$this->textToSearch}%" OR  
)
EOC;
    $criteria->addCondition($text_condition);
}

Есть предложения?

1 Ответ

0 голосов
/ 26 апреля 2018

Вы должны использовать params для передачи ненадежных данных для запроса. Обратите внимание, что символы %, _ и \ имеют особое значение в SQL-запросе, поэтому вам также необходимо их экранировать.

$criteria = new CDbCriteria();
if (!empty($this->textToSearch)) {
    $text_condition = <<<EOC
(
    topic LIKE :text_to_search OR
    main LIKE :text_to_search  
)
EOC;
    $criteria->addCondition($text_condition);
    $textToSearch = strtr($this->textToSearch, [
        '%' => '\%',
        '_' => '\_',
        '\\' => '\\\\',
    ]);
    $criteria->params[':text_to_search'] = "%{$textToSearch}%";
}
...