Доброго дня! Хочу узнать, возможна ли sql инъекция в базу данных MySQL через функцию? Т.е. пользователь в поле ввода вписывает значение "225" и если это значение совпадает со значением в функции, то присваивается переменная $value, в которой значение "computer" и после этого идет запрос в базу. По логике, если это значение не совпадает со значением в функции и это значение не идет напрямую в запрос(ведь значение сначала попадает в функцию и обрабатывается там), то это значит что инъекция невозможна PHP: if(isset($_POST['number']) && $_POST['number'] == '225') { $value = "computer"; } mysqli_query($connect, "UPDATE `users` SET `value` = '$value' WHERE `users`.`id` = '$id'"); PHP изучаю всего лишь месяц, не ругайте меня. Если я не прав - скажите об этом, и помогите, пожалуйста, исправить.
логика sql-инъекций не в этом... даже если предположить что часть SET `value` = '$value' в этом случае действительно не подвержена атаке, так как $value строго чему-то задано... что не факт... так как по вашему коду не видно чему равно $value в случае если условие не выполняется то остается "самое вкусное" для инъекций - WHERE `users`.`id` = '$id'" ...не видно - откуда берется $id - но если предположить что из $_POST/$_GET['id'] то можно наворотить все что хочешь.... $id = "1' OR 1=1'. итд Вы везде говорите о функции - у вас ее тут нигде нет... что то вы с терминологией путаете Не изобретайте велосипеда с квадратными колесами, используйте общепринятые практики с подготовленными запросами
Большое спасибо за ответ! $id берется из сессии при входе, хранится в куки, злоумышленник может его как-то достать? Насчет $value, я не ставил условия если код не выполняется, т.к. не понял зачем это нужно) разве что для вывод сообщения, стоит поставить какое-то условие и если нужно то почему? Насчет функции напутал) насмотрелся обучающих видео и немного запутался, функцией я имел ввиду "if".
Буквально достать нет, не может. Но откуда этот id берется до того как попал в сессию? Вот тут для злоумышленника наверное простор для действий --- Добавлено --- Лучше не вынуждать себя или того, кто будет работать с кодом после вас, проводить расследование "что откуда берется во всех вариантах". Используйте подготовленные выражения с плейсхолдерами и закройте эту потенциальную дыру. Берегите время и нервы! Завтра эта ваша функция может измениться, а вы уже забудете, что без неё возможна инъекция. Код не должен быть хрупким.
регистрацию взял из видеоурока, т.к. опыта мало делать самописную, тем более вроде как регистрация хорошая, посмотрев код, я так понял id берется отсюда: PHP: $userId = $_SESSION['user']['id'] ?? null; $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->execute(['id' => $userId]); return $stmt->fetch(\PDO::FETCH_ASSOC); Спасибо за предупреждение, делаю для себя, код ни в чьи руки не перейдет, даже сам сайт открыт на моем компьютере. Я так понимаю, лучше перейти с mysqli на pdo, для улучшения безопасности, но если $value нельзя подделать то можно оставить все так, безопасность не страдает?
Страдает. Потому что ты сам скопируешь свой рабочий фрагмент в другой контекст и там он окажется уязвим. Безопасным считается пессимистический подход: если фигня может случиться, она случится. Only the paranoid survive