«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/12/08 11:27:56  №1307965 1
'SELECT * FROM student LIMIT $limit OFFSET $offset'
Такие же запросы можно использовать? Просто в задаче про студентов написано, что нельзя переменные вставлять прямо в запрос. Но здесь нет никаких данных введенных пользователем, для них же защита не нужна?
Ответы: >>1308059 >>1308109
Аноним 2018/12/08 13:58:59  №1308059 2
>>1307965
>Но здесь нет никаких данных введенных пользователем, для них же защита не нужна?
Ты, скорее всего, функцию запроса к БЖ не очень удачно реализовал - в норме она очищает вообще все данные извне, пользователь там или само прилетело.
Покаж функцию свою.
Ответы: >>1308062
Аноним 2018/12/08 14:05:38  №1308062 3
>>1308059
public function getStudentsByLimit($limit, $offset){
$db = $this->dbase;
$stmt = $db->prepare("SELECT * FROM student LIMIT $limit OFFSET $offset");
$stmt->execute();
$result = $stmt->fetchAll();
return $result;
}
Ответы: >>1308113 >>1308178 >>1308207
Аноним 2018/12/08 15:10:21  №1308109 4
>>1307965

А откуда ты в функции знаешь, откуда пришли данные? На них это не написано. Плюс, offset явно создается на основе данных пользователя.

Ну вот ты напишешь функцию:

function getStudent($limit, $offset)
{
....
'SELECT * FROM student LIMIT $limit OFFSET $offset'
...
}

Как проверить, что она безопасна? Где гарантия, что в нее всегда передают только числа? Это ты думаешь, что в нее передают только числа, но завтра кто-нибудь напишет

getStudents($_GET['limit'], ...)

И у нас инъекция.

Должно быть видно, что функция безопасна, без исследования остального кода. Она должна быть написана так, чтобы быть безопасной, что бы в нее не передавали.

Кстати, в случае чисел для защиты достаточно применить intval() или поставить тайп-хинт int, но через плейсхолдеры все же будет надежнее. Их убрать труднее, чем заменить int на string, не заметив что это для обеспечения безопасности.
Ответы: >>1308169 >>1308176
Аноним 2018/12/08 16:17:20  №1308169 5
>>1308109
Пользователь не может передать туда ничего, у меня там идет не через гет, а просто типа site.com/page/2. Там все рассчитывается для создания пагинации. В оффсет и лимит не может попасть ничего кроме числа по идее. Я понимаю что этого не видно и тут не экстрасенсы сидят. Может я вопрос не так задал: можно ли вставлять переменные прямо в sql запрос, если я уверен, что туда не попадет какая-нибудь левая хуйня? Не будут ли на меня смотреть как на дауна из-за этого?
Ответы: >>1308178
Аноним 2018/12/08 16:22:32  №1308178 6
>>1308169

Ты то ли невнимательно прочел пост, то ли что-то не так понял.

Функция, работающая с SQL, должна работать безопасно, что бы в нее не передавали. И защита должна быть сделана в самой функции. Чтобы смотря только на эту функцию, было видно что она безопасна.

Функция >>1308062\t этим требованиям не соответствует.

Ты не можешь гарантировать, что в твою функцию будут передавать только числа. Так как это знание есть только в твоей голове, завтра тебя уволят, наймут нового разработчика и он передаст туда строку от пользователя.

Попробуй подумать чуть масштабнее: проект может разрабатывать несколько человек, код может быть большой и ты замучаешься весь изучать. Потому функция была должна быть написана безопасно сама по себе, чтобы для ее проверки не надо было изучать остальной код.
Ответы: >>1308183
Аноним 2018/12/08 16:26:52  №1308183 7
>>1308178
Да, спасибо, я понял. Просто не подумал, что нужно защищать код не только от злых хакеров (лол), но и от мифического человека, использующего мой скрипт.
Ответы: >>1308189
Аноним 2018/12/08 16:34:41  №1308189 8
>>1308183
>от мифического человека, использующего мой скрипт
Ты сам через месяц забудешь что там накалякал.