Что такое MySQL инъекция: определение, примеры и защита

Что такое MySQL Injection?

MySQL Injection – это техника злоупотребления, при которой злонамеренный пользователь может внедрить вредоносный SQL код в запросы к базе данных MySQL, обходя таким образом механизмы авторизации и получая несанкционированный доступ к данным.

Пример:

Предположим, у нас есть форма входа на сайт, где пользователь вводит свое имя пользователя и пароль:

<form action="login.php" method="post">
    <input type="text" name="username" placeholder="Имя пользователя">
    <input type="password" name="password" placeholder="Пароль">
    <input type="submit" value="Войти">
</form>

Исходный код файла login.php:

<?php
// Получение введенных пользователем данных
$username = $_POST['username'];
$password = $_POST['password'];

// Запрос к базе данных для проверки данных пользователя
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($connection, $query);
...
?>

В данном примере, злоумышленник может использовать MySQL Injection, введя в поле "Имя пользователя" следующий текст:

admin' OR '1'='1

Это приведет к изменению исходного SQL запроса следующим образом:

SELECT * FROM users WHERE username='admin' OR '1'='1' AND password='$password'

Таким образом, злоумышленник успешно обойдет механизм проверки пароля и получит доступ к системе, несмотря на то, ввел ли он правильный пароль или нет.

Чтобы предотвратить SQL инъекции, важно использовать параметризованные запросы, такие как подготовленные выражения (prepared statements) или хранимые процедуры, а не вставлять пользовательский ввод напрямую в SQL запросы.

Детальный ответ

Привет! Давай разберёмся, что такое SQL-инъекция и как она работает. SQL-инъекция является одним из наиболее распространенных видов атак на веб-приложения. Давай погрузимся в детали!

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

Давай рассмотрим пример для лучшего понимания. Представь, что у тебя есть веб-приложение, которое позволяет пользователям авторизоваться. При авторизации пользователь вводит свои учетные данные, которые затем используются для выполнения SQL-запроса, чтобы проверить, есть ли соответствующая запись в базе данных. Ниже приведен пример кода на PHP для авторизации пользователя:


$username = $_POST['username'];
$password = $_POST['password'];

$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_query($query);

if(mysql_num_rows($result) > 0) {
    // Пользователь авторизован
} else {
    // Неправильные учетные данные
}

Имей в виду, что этот пример устарел и использует функции, которые небезопасны и подвержены SQL-инъекции. Однако, структурно такие атаки всё ещё возможны и имеют общие черты в современных системах. Обрати внимание на строку, где формируется SQL-запрос:


$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

Здесь используются переменные `$username` и `$password`, которые получают значение от пользователя через POST запрос. Если злоумышленник введет в поле `username` следующее значение: `' OR '1'='1`, то итоговый SQL-запрос после подстановки значений может выглядеть так:


SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '$password'

В результате этого SQL-запроса, условие `1=1` всегда истинно, и злоумышленник может получить доступ к данным, которых ему быть не должно. Вот и вся суть SQL-инъекции!

**Как предотвратить SQL-инъекции?**

Существуют несколько способов защитить свое приложение от SQL-инъекций:

1. **Wспользуй подготовленные выражения или параметризированные запросы** - Вместо конкатенации пользовательского ввода с SQL-запросами, используй подготовленные выражения или параметризированные запросы, которые позволяют явно указать параметры и значения, избегая возможности инъекций. Вот пример кода, использующего подготовленные выражения:


$stmt = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();

// Используйте результаты запроса здесь

2. **Фильтрация ввода данных** - Перед использованием пользовательского ввода, всегда фильтруй его, чтобы удалить любые потенциально опасные символы или команды. Например, используйте функцию `mysqli_real_escape_string()` для обработки пользовательских строковых значений.


$username = mysqli_real_escape_string($db, $_POST['username']);
$password = mysqli_real_escape_string($db, $_POST['password']);

3. **Нужно ограничить права доступа к базе данных** - Всегда используй минимальные привилегии и ограничь доступ к базе данных только тем запросам, которые имеют действительную необходимость.

4. **Установи обновления для своего ПО** - Важно постоянно обновлять вашу систему, фреймворк и библиотеки, чтобы защититься от известных уязвимостей, которые могут быть использованы для атак.

5. **Обязательно тестируй свое приложение** - Проводи регулярное тестирование на наличие уязвимостей и атак, чтобы убедиться, что твое приложение защищено.

Теперь, когда мы изучили, что такое SQL-инъекция и как ее предотвратить, ты можешь быть уверен в безопасности своего веб-приложения. Защити свой код и данные от злоумышленников, следуя указанным рекомендациям.

Удачного программирования! Если у тебя есть еще вопросы, не стесняйся задавать!

Видео по теме

SQL Injection - теория и примеры

Основы баз данных и SQL. Введение в SQL инъекции

Учимся пентесту на практике с нуля | TryHackMe - Wekor | Wordpress | SQL инъекции

Похожие статьи:

Что такое MySQL инъекция: определение, примеры и защита