За последние 24 часа нас посетили 18519 программистов и 1624 робота. Сейчас ищут 1052 программиста ...

sql инъекция

Тема в разделе "PHP и базы данных", создана пользователем ladameister, 6 ноя 2023.

  1. ladameister

    ladameister Новичок

    С нами с:
    6 ноя 2023
    Сообщения:
    3
    Симпатии:
    0
    Доброго дня! Хочу узнать, возможна ли sql инъекция в базу данных MySQL через функцию?
    Т.е. пользователь в поле ввода вписывает значение "225" и если это значение совпадает со значением в функции, то присваивается переменная $value, в которой значение "computer" и после этого идет запрос в базу. По логике, если это значение не совпадает со значением в функции и это значение не идет напрямую в запрос(ведь значение сначала попадает в функцию и обрабатывается там), то это значит что инъекция невозможна
    PHP:
    1. if(isset($_POST['number']) && $_POST['number'] == '225') {
    2.     $value = "computer";
    3. }
    4.  
    5. mysqli_query($connect, "UPDATE `users` SET `value` = '$value'  WHERE `users`.`id` = '$id'");
    PHP изучаю всего лишь месяц, не ругайте меня. Если я не прав - скажите об этом, и помогите, пожалуйста, исправить.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    логика sql-инъекций не в этом...

    даже если предположить что часть SET `value` = '$value' в этом случае действительно не подвержена атаке, так как $value строго чему-то задано... что не факт... так как по вашему коду не видно чему равно $value в случае если условие не выполняется
    то остается "самое вкусное" для инъекций - WHERE `users`.`id` = '$id'" ...не видно - откуда берется $id - но если предположить что из $_POST/$_GET['id'] то можно наворотить все что хочешь.... $id = "1' OR 1=1'. итд

    Вы везде говорите о функции - у вас ее тут нигде нет... что то вы с терминологией путаете

    Не изобретайте велосипеда с квадратными колесами, используйте общепринятые практики с подготовленными запросами
     
    [vs] нравится это.
  3. ladameister

    ladameister Новичок

    С нами с:
    6 ноя 2023
    Сообщения:
    3
    Симпатии:
    0
    Большое спасибо за ответ! $id берется из сессии при входе, хранится в куки, злоумышленник может его как-то достать? Насчет $value, я не ставил условия если код не выполняется, т.к. не понял зачем это нужно) разве что для вывод сообщения, стоит поставить какое-то условие и если нужно то почему? Насчет функции напутал) насмотрелся обучающих видео и немного запутался, функцией я имел ввиду "if".
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.105
    Симпатии:
    1.243
    Адрес:
    там-сям
    Буквально достать нет, не может. Но откуда этот id берется до того как попал в сессию? Вот тут для злоумышленника наверное простор для действий ;)
    --- Добавлено ---
    Лучше не вынуждать себя или того, кто будет работать с кодом после вас, проводить расследование "что откуда берется во всех вариантах". Используйте подготовленные выражения с плейсхолдерами и закройте эту потенциальную дыру. Берегите время и нервы!
    Завтра эта ваша функция может измениться, а вы уже забудете, что без неё возможна инъекция.

    Код не должен быть хрупким.
     
  5. ladameister

    ladameister Новичок

    С нами с:
    6 ноя 2023
    Сообщения:
    3
    Симпатии:
    0
    регистрацию взял из видеоурока, т.к. опыта мало делать самописную, тем более вроде как регистрация хорошая, посмотрев код, я так понял id берется отсюда:
    PHP:
    1.     $userId = $_SESSION['user']['id'] ?? null;
    2.  
    3.     $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
    4.     $stmt->execute(['id' => $userId]);
    5.     return $stmt->fetch(\PDO::FETCH_ASSOC);
    Спасибо за предупреждение, делаю для себя, код ни в чьи руки не перейдет, даже сам сайт открыт на моем компьютере. Я так понимаю, лучше перейти с mysqli на pdo, для улучшения безопасности, но если $value нельзя подделать то можно оставить все так, безопасность не страдает?
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    ну вот же, тут используете подготовленные запросы.. так-же используйте при добавлении значения
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.788
    Симпатии:
    1.328
    Адрес:
    Лень
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.105
    Симпатии:
    1.243
    Адрес:
    там-сям
    Страдает. Потому что ты сам скопируешь свой рабочий фрагмент в другой контекст и там он окажется уязвим.
    Безопасным считается пессимистический подход: если фигня может случиться, она случится. Only the paranoid survive :)
     
    don.bidon нравится это.