Проблема с уязвимостью в CActiveDataProvider

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
skyflox
Сообщения: 14
Зарегистрирован: 2011.03.25, 00:29

Проблема с уязвимостью в CActiveDataProvider

Сообщение skyflox »

Пишу небольшое приложень и потребовалась возможность поиска по модели. Результаты отображаются в GridView, а контроллер написан следующим образом:

Код: Выделить всё

$criteria=new CDbCriteria;
$criteria->condition = 'string LIKE :string';
$criteria->params = array(':string' => $_GET['string']);

$sort = Array(
   'defaultOrder' => '`t`.Type ASC',
   'attributes'=>array(
      'String',
      'Type',
   ),
);

$dataProvider=new CActiveDataProvider($S,array(
   'pagination'=>array(
      'pageSize'=>20,
   ),
   'criteria' => $criteria,
      'sort' => $sort,
));
Все замечательно работает, сортировка, пагинация, AJAX. Но есть одно большое НО - в конроллер передается текст набранный пользователем, а это потенциальная SQL Injection.
PDO с CDbCriteria не работает, и все параметры передаются как есть. Простейшая инъекция %_% - приводит к тому что выдаются все записи из таблицы.
bindParam для CDbCriteria не существует.
mysql_escape_string с YIi тоже не работает. Можно наверное конечно подключиться к базе, но делать это каждый раз, получая как минимум 2 подключения к базе на 1 приложение не хочется.
Описанный на форуме вариант CHtml::encode($_GET['string']) - не спасает.

Возникает закономерный вопрос, что делать? Может есть какой-то другой путь, просто я его не вижу?
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение lancecoder »

валидация
skyflox
Сообщения: 14
Зарегистрирован: 2011.03.25, 00:29

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение skyflox »

Сомневаюсь, т.к. тут надо не отсеивать, а именно экранировать потенциально опасные символы, поскольку строка запроса вида '40% motor_oil' вполне имеет право быть и должна бы выдавать корректный результат.
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение lancecoder »

addSearchCondition
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение lancecoder »

Код: Выделить всё

public function addSearchCondition($column,$keyword,$escape=true,$operator='AND',$like='LIKE')
{
    if($keyword=='')
        return $this;
    if($escape)
        $keyword='%'.strtr($keyword,array('%'=>'\%', '_'=>'\_', '\\'=>'\\\\')).'%';
    $condition=$column." $like ".self::PARAM_PREFIX.self::$paramCount;
    $this->params[self::PARAM_PREFIX.self::$paramCount++]=$keyword;
    return $this->addCondition($condition, $operator);
} 
alekso
Сообщения: 190
Зарегистрирован: 2012.09.15, 23:49

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение alekso »

читаем:
Even if no SQL injection in possible in the previous queries, there is still room for improvement. The SQL function LIKE has a special treatment for the characters "_" and "%". In many cases, this is not a problem, with mostly unexpected results. But if the data queried is huge, then transforming a "begin%" condition into "%s%a%" condition can make the query so heavy that it slows the SQL server, because no index can be used for the later. So you should protect the characters "%" and "_" when the user input is going into a LIKE condition, for example with str_replace(). See further for example of how CDbCriteria::compare() or CDbCriteria::addSearchCondition() can simplify this.

http://www.yiiframework.com/wiki/275/ho ... ions/#hh11
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение lancecoder »

последнее время я смотрю народ вообще обленился читать, месяца 3 назад еще были адекватные вопросы, а щас что не вопрос, так есть в мануале
skyflox
Сообщения: 14
Зарегистрирован: 2011.03.25, 00:29

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение skyflox »

Спасибо. Проморгал эту функцию... (
Аватара пользователя
RusAlex
Сообщения: 324
Зарегистрирован: 2010.08.29, 15:30

Re: Проблема с уязвимостью в CActiveDataProvider

Сообщение RusAlex »

Что за бред ? CDbCriteria сама вообще не биндит никакие параметры. Этим занимается CDbCommand, и не важно как вы передаете их, через CDbCriteria, или напрямую в метод CActiveRecord::find() и его производные, параметры БИНДЯТСЯ как надо.
Не вводите людей в заблуждение.
Ответить