Как использовать 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()
(или любая другая подобная функция).