Как использовать mysql_escape_string() в фреймворке Yii?

Как мы все знаем, мы не можем использовать необработанные запросы MySQL в таких средах, как Yii. Я хочу использовать mysql_escape_string в моем проекте, который работает в среде Yii, чтобы избежать SQL-инъекций при вводе пользователем.

Я знаю что mysql_escape_string устарел в PHP 5.5 и что у меня есть альтернатива PDO. Какая альтернатива в среде Yii, а также способ PDO для mysql_escape_string()?

5 ответов

Решение

Альтернатива mysql_escape_string в PDO использует подготовленные заявления. В Yii например:

$user = Yii::app()->db->createCommand()
    ->select('username, password')
    ->from('tbl_user')
    ->where('id=:id', array(':id'=>$_GET['userId']))
    ->queryRow();

(Из справочной документации Yii http://www.yiiframework.com/doc/api/1.1/CDbCommand)

Вы защищены от внедрения SQL-кода при передаче параметров через заполнители в подготовленном выражении.

Для автоматического экранирования параметров лучше всего использовать подготовленные операторы. Тем не менее, этот метод CDbConnection также должен сделать свое дело:

Yii::app()->db->quoteValue($your_value);

По сути, это кавычки строковое значение для использования в запросе, это обертка PDO::quote(),

Узнайте больше здесь.

Экранирование параметров запроса с использованием подготовленных запросов '?' у заполнителей есть свои недостатки (параметр escaped перемещается из тела запроса, что затрудняет работу с некоторыми запросами; может быть дополнительный обходной путь к базе данных, который не всегда оправдан; если запрос по сути динамический, то подготовка многих из них может потребовать ресурсов сервера).

В Yii есть метод quoteValue, который можно использовать для экранирования параметров запроса за пределами подготовленной формы запроса.

Используйте CHTMlPurifier:

// Example
$p = new CHtmlPurifier();

$user = Yii::app()->db->createCommand()
    ->select('username, password')
    ->from('tbl_user')
    ->where('id=:id', array(':id'=>$p->purify($_GET['userId']);))
    ->queryRow();

Возможно добавить вредоносный код в параметры получения.

Вам не нужно экранировать параметры при использовании ActiveRecords,

Однако, если вы хотите использовать это mysql_escape_string функция, которую вы можете попробовать с mysqli_escape_string()

Я использовал это с Yii при выполнении запросов высокой сложности, которые имели бы проблемы с производительностью при работе с моделями, и мне нужно было выполнять запросы SQL непосредственно к БД.

Для этого вы можете использовать Yii::app()->db->createCommand($sql)->queryAll() (или любая другая подобная функция).

Другие вопросы по тегам