Бортовой журнал Ктулху

Как не допустить SQL-инъекции в Yii2

Тема, конечно, не новая, но напомнить полезно.

В Yii2 есть свой механизм конструирования SQL запросов, поэтому, стоит использовать только его и не допускать "чистых" запросов. Лучше использовать Active Record или, если не хочется городить модель, использовать CreateCommand.

 

Пример "чистого" запроса:

Yii::$app->db->createCommand('SELECT * FROM user WHERE id = ' . $_GET['id'])->queryOne();

Пример того же на ActiveRecord:

self::find()->asArray()->where(['id' => $_GET['id]])->one();

Пример с createCommand:

$command = Yii::$app->db->createCommand('SELECT * FROM user WHERE id = :id');
$user = $command->bindValue(':id', 123)->queryOne();

Пример с несколькими параметрами в запросе:

$command = \Yii::$app->db->createCommand("select * from user where id = :id and name = :name and sex = :sex");
$command->bindValue(':id', 123);
$command->bindValue(':name', 'Vasiliy');
$command->bindValue(':sex', 'regularly');
$user = $command->queryOne();