Active record и SQL инъекции

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Active record и SQL инъекции

Сообщение i-programmer »

Здравствуйте.
Скажите, правильно ли я понимаю, что у ActiveRecord в условии `where` не происходит никакого автоматического анализа входного массива и не происходит процесс подготовки запроса?

Например есть запрос:

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

User::find()->where(['user_id' => $userId])
Происходит ли тут автоматический разбор условия и привязка подготовленных переменных?

И есть код

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

User::find()->where('user_id=' . $userId)
Происходит ли тут какой-то разбор условия и привязка подготовленных переменных?


или всегда надо писать так:

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

User::find()->where('user_id=:user_id', [':user_id' => $userId])
???
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Active record и SQL инъекции

Сообщение skynin »

i-programmer писал(а): 2020.10.15, 15:53

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

User::find()->where(['user_id' => $userId])
Происходит ли тут автоматический разбор условия и привязка подготовленных переменных?
происходит.
подробности - покопайтесь в реализации в QueryBuilder
i-programmer писал(а): 2020.10.15, 15:53 И есть код

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

User::find()->where('user_id=' . $userId)
Происходит ли тут какой-то разбор условия и привязка подготовленных переменных?
а тут да, может быть плохо:
Не встраивайте переменные непосредственно в условие, особенно если значение переменной получено от пользователя, потому что это делает ваше приложение подверженным атакам через SQL инъекции.
https://www.yiiframework.com/doc/guide/ ... ry-builder
При использовании привязки параметров, вы можете вызывать params() или addParams() для раздельного указания параметров.
$query->where('status=:status')
->addParams([':status' => $status]);

А конструкция User::find()->where(['user_id' => $userId] собственно это и делает внутри QueryBuilder

Общее правило - старайтесь обрабатывать полученные извне данные, ограничивать типами, и т.п.
Обычно достаточно использовать средства фреймворка, и избегать всяких $_SERVER['QUERY_STRING'], то есть низкорувневой обработки HTTP запросов. Бывает она нужна, тогда предельное внимание!

Внутри там обычно все делается.
Когда возникают сомнения - смотрите в код фреймворка.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
serg-tur
Сообщения: 10
Зарегистрирован: 2019.11.19, 20:04

Re: Active record и SQL инъекции

Сообщение serg-tur »

Если у вас $userId число, то перед такой подстановкой преобразуйте его функцией intval($userId).
А в целом следуйте рекомендациям skynin
Ответить