Загрузка...

Php + Mysqli с примерами для новичков + защита от sql инъекций

Тема в разделе Backend создана пользователем USDC 20 мар 2019. 1011 просмотров

Загрузка...
  1. USDC
    USDC Автор темы 20 мар 2019
    Заказать качество можно здесь.

    Делать нехуй, напишу основное насчет скули для, подчеркиваю, новичков, чтобы проще и быстрее можно было написать свое первое детище

    Первое правило - забыли про расширение mysql - оно устарело и неактуально, используем только mysqli, версия php должна быть выше 5

    1. Подключение к БД
    Для того, чтобы работать с БД, нужно к ней подключиться, следуя нашей цели узнаем у хостера следующие данные: хост(чаще всего localhost, за редким исключением), название БД(создаете сами или просите хостера), логин и пароль БД аналогично названию указываете сами при создании или узнаете у хостера.

    Затем в своем php файле создаете подключение:

    Код
    $db = new mysqli_connect("localhost","login","pass","dbname") or die("Не подключились к БД, причина: ". mysqli_error($db));

    Где: $db - новое подключение, через эту переменную мы будем обращаться к базе
    Данные в скобках - ваши, см. выше
    Конструкция die будет в случае ошибки отображать причину, почему не удалось подключиться к БД

    2. Запросы к БД
    Взаимодействие сайта с БД происходит посредством запросов к последней.

    Возьмем за основу следующую структуру БД, для простоты таблица будет называться НАЗВАНИЕТАБЛИЦЫ, наполнена она так:
    ID - RATING - MONEY
    1 - 5 - 10
    2 - 7 - 5
    3 - 22 - 105
    4 - 28 - 30

    Все три столбца - int, т.е числовые. При этом значение ID имеет флажок auto_increment

    2.1 Запрос выглядит, например, так:

    Код
    mysqli_query($db, "select * from НАЗВАНИЕТАБЛИЦЫ where money > 100 and rating = 10");
    Или так:

    $db->query("
    select * from НАЗВАНИЕТАБЛИЦЫ where money > 100 and rating = 10");

    Где $db - наше подключение, названиетаблицы - название таблицы, параметры после where - столбцы в таблице.

    В данном случае выполняется выборка по следующим критериям: выбираем строки из таблицы, где столбец деньги больше ста, а столбец рейтинг больше десяти. Соответственно нашей таблице, выбрано будет одно значение с идентификационным номером 3.

    В случае, если нужно просто выбрать все строки для последующей работы с ними, конструкция where убирается.

    Кроме выборки мы попробуем обновлять, удалять данные в таблице, разумеется команд для обращения к БД очень много, но для новичков мы ограничимся вышеперечисленными

    2.2 Обновление значения столбца в базе данных

    Для обновления значения используется запрос UPDATE, изменим значение столбца денег в строке 3:

    Код
    $db->query("update НАЗВАНИЕТАБЛИЦЫ set money = 5 where id = 3");

    Кроме того, мы можем производить операции прямо со значением в базе данных, например, если идет списание баланса за какую-то услугу:

    Код
    mysqli_query($db,"update НАЗВАНИЕТАБЛИЦЫ set 'money'='money' - 5 where id=3");

    В данном случае из текущего значения столбца денег в строке 3 мы вычтем число 5.
    Я специально использовал разные варианты отправки запросов в обоих случаях, чтобы показать, что можно писать запрос и так, и так, кому как удобнее. В последнем случае так же обязательно вешать на название столбца кавычки, кроме того, в случае, если редактируемая информация - текст, необходимо также использовать кавычки.

    2.3 Удаление данных
    Для удаления используется команда DELETE, запрос строится следующим образом:

    Код
    mysqli_query($db,"delete from НАЗВАНИЕТАБЛИЦЫ where money =0");

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

    3. О безопасности

    Злоумышленник может при обращении к сайту вводить вместо данных (например, имени) запросы к БД и БД может их выполнить. Следовательно, необходимо защитить свои запросы от этого. Лучше сделать отдельную собственную функцию, которую впоследствии будет использовать проще, чем постоянно обращаться напрямую.

    Речь идет о функции mysqli_real_escape_string.

    В своем конфигурационном файле ниже соединения дописываем следующее:

    Код
    function re($data) {
    $m = mysqli_real_escape_string($db, $data);
    return $m;
    }

    При этом переменную $db необходимо объявить глобальной.

    Данная функция будет обрабатывать данные и экранировать запросы к БД, если они есть, таким образом, в базу не получится въебать зловредный запрос.

    Создав данную функцию, нам теперь необходимо обрабатывать входящие от юзера данные, следующим образом:

    Допустим, пользователь отправляет данные через форму методом пост-запроса, принимаем, присваиваем переменную и сразу обрабатываем:

    Код
    $money = re($_POST["money"]);

    Теперь мы можем безопасно отправить в базу запрос с полученными от юзера данные, пример:

    Код
    mysqli_query($db,"update НАЗВАНИЕТАБЛИЦЫ set money = $money where id = 1");

    Таким образом, мы установили столбцу деньги в строке 1 новое значение, полученное от пользователя, при этом избежали возможных sql-инъекций.

    В итоге у нас получился следующий файл config.php:

    Код
    <? // подключение
    $db = new mysqli_connect("localhost","login","pass","dbname") or die("Не подключились к БД, причина: ". mysqli_error($db));
    // объявляем глобальной
    global $db;
    // дописываем функцию
    function re($data) {
    $m = mysqli_real_escape_string($db, $data);
    return $m;
    }

    И следующее нужно дописать в файл index.php в самый верх

    <? include_once 'config.php';
    // далее можем работать с базой данных, используя вышеперечисленных команды
    ?>
     
  2. USDC
    USDC Автор темы 20 мар 2019
    Статья написана с телефона, так что код не выделен
     
  3. 0xdie
    Спасибо за статью, можно например её продолжить: Вывод переменных из таблице на сайте, сделать что-то типа новостей.
    А так спасибо, очень кратко и полезно! :finger_up:
     
Top