MySQL инъекция что это такое и как защитить сайт

MySQL инъекция что это такое и как защитить сайт

Что такое MySQL инъекция (SQL Injection) — это одна из самых распространённых и опасных уязвимостей web-приложений. Она возникает, когда пользовательский ввод напрямую используется в SQL запросах без должной проверки и обработки входящих данных. В результате злоумышленник может получить доступ к данным, изменить их или полностью нарушить работу сайта.

В этой статье разберём, что такое MySQL инъекция, как она работает, приведём примеры уязвимого кода и покажем, как правильно защитить PHP-приложение.

Что такое MySQL инъекция

MySQL инъекция — это атака, при которой вредоносный SQL код внедряется в запрос к базе данных. Если сервер не фильтрует входные данные, MySQL выполнит этот код как часть запроса.
Основные последствия MySQL-инъекций:

  • Кража логинов и паролей.
  • Обход авторизации.
  • Удаление или изменение данных.
  • Получение структуры базы данных.
  • Полный контроль над БД.

Как работает MySQL инъекция

Атака происходит в несколько этапов:

  1. Пользователь вводит данные (форма, URL, cookie).
  2. Эти данные напрямую подставляются в SQL-запрос.
  3. MySQL выполняет изменённый запрос.
  4. Злоумышленник получает доступ к данным.

Пример уязвимого кода (MySQL инъекция)

Рассмотрим типичный пример неправильного запроса в PHP. Например, ранее мы писали про авторизацию и регистрацию на php, где обработка данных нужна по умолчанию.

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

$sql = "SELECT * FROM users 
        WHERE login = '$login' 
        AND password = '$password'";

$result = mysqli_query($conn, $sql);

Если в поле login ввести: ‘ OR 1=1 — то будет подмена условий и запрос станет совсем другим. SQL-запрос превратится в:

SELECT * FROM users WHERE login = '' OR 1=1 -- ' AND password = ''

В результате условие всегда истинно, и авторизация будет пройдена без пароля. Это классический пример mysql инъекции.

Виды MySQL инъекций

Существует несколько распространённых типов SQL-инъекций:

  • Classic SQL Injection — внедрение кода напрямую
  • Blind SQL Injection — получение данных через логические ответы
  • Error-based Injection — использование сообщений об ошибках
  • Union-based Injection — применение UNION SELECT
  • Time-based Injection — задержки выполнения (SLEEP())

UNION-based MySQL инъекция (пример)

' UNION SELECT user(), database(), version() --

Такой ввод может позволить злоумышленнику узнать:

  • Текущего пользователя MySQL
  • Имя базы данных
  • Версию сервера

Как защититься от MySQL инъекций

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

1. Использовать подготовленные выражения (prepared statements)

Это самый надёжный способ защиты. Пример с PDO:

$stmt = $pdo->prepare(
    "SELECT * FROM users WHERE login = :login AND password = :password"
);

$stmt->execute([
    'login' => $login,
    'password' => $password
]);

В этом случае MySQL не воспринимает данные как SQL-код.

2. Использовать mysqli с bind_param

Этот пример схож с предыдущим:

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

3. Никогда не доверять пользовательскому вводу

Следует проверять:

  • Длину строки
  • Формат данных
  • Допустимые символы

Пример простой фильтрации:

$login = trim($login);
$login = htmlspecialchars($login);

4. Ограничить права пользователя MySQL

Пользователь БД не должен иметь:

  • DROP
  • DELETE
  • ALTER

если это не требуется.

5. Отключить вывод ошибок в продакшене

ini_set('display_errors', 0);

Ошибки SQL могут подсказать структуру базы данных злоумышленнику.

Как проверить сайт на MySQL инъекции

Для тестирования используются:

  • Ручная проверка (‘ OR 1=1)
  • SQLMap
  • Burp Suite
  • Специальные security-сканеры

Важно: тестировать только свои проекты или с разрешения владельца.

Частые ошибки, ведущие к MySQL инъекциям

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

  • Конкатенация SQL строк
  • Использование mysql_* (устаревшие функции)
  • Отсутствие валидации данных
  • Хранение паролей в открытом виде
  • Вывод SQL ошибок пользователю

Любой PHP-разработчик обязан понимать, как работает MySQL инъекция, чтобы создавать безопасные и надёжные веб-приложения.