Как мы все знаем, мы не можем использовать необработанные запросы MySQL в таких рамках, как Yii. Я хочу использовать mysql_escape_string
в моем проекте, который работает в системе Yii, чтобы уйти от SQL-инъекции во вход пользователя.
Я знаю, что mysql_escape_string
устарел в PHP 5.5 и что у меня есть альтернатива PDO. Какова альтернатива в структуре Yii, а также способ PDO для mysql_escape_string ()?
Альтернативой 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-инъекции, когда передаете параметры через заполнители в подготовленном сообщении.
Использовать 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();
В параметрах get можно добавить вредоносный код.
Экранирование параметров запроса с помощью подготовленных запросов?? у заполнителей есть свои недостатки (экранированный параметр удаляется из тела запроса, что затрудняет работу с некоторыми запросами, возможно, в базу данных может быть добавлен дополнительный обратный маршрут, который не всегда оправдан; если запрос по существу динамический, тогда подготовка многих из них может привести к серверным ресурсам).
Yii имеет метод quoteValue, который может использоваться для исключения параметров запроса вне формы запроса.
Вам не нужно избегать параметров при использовании ActiveRecords
.
Однако, если вы хотите использовать эту функцию mysql_escape_string
вы можете попробовать с помощью mysqli_escape_string()
Я использовал это с Yii
при выполнении запросов с высокой степенью сложности, которые имели бы проблемы с производительностью при работе с моделями, и мне нужно было выполнить SQL-запросы непосредственно в БД.
Для этого вы можете использовать Yii::app()->db->createCommand($sql)->queryAll()
(или любую другую аналогичную функцию).