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

SQL-инъекция: что это, как работает и лучшие способы защиться

7 апреля 2025
15 минут
эксперт в информационной безопасности в Start X
Андрей Жаркевич
автор, дипломированный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
автор, дипломиро­ванный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
эксперт в информационной безопасности в Start X
Андрей Жаркевич

Что такое SQL-инъекция и чем она опасна

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

Это как открыть злоумышленнику двери базы данных и сказать: «Бери, что хочешь». Вот что он может сделать:

  • Украсть данные. Логины, пароли, номера карт, конфиденциальная информация — все это доступно для кражи.
  • Удалить или изменить информацию. С помощью SQL-инъекции хакер может стереть заказы из интернет-магазина, изменить финансовую информацию или вообще «обнулить» базу.
  • Заполучить контроль над сервером. В некоторых случаях хакер выходит за пределы базы данных и внедряется в операционную систему сервера.

SQL-инъекции существуют больше 20 лет и остаются актуальными потому, что код пишут люди, а они совершают ошибки.

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

Представьте, что вы зашли на сайт, ввели логин и пароль. Приложение отправляет запрос, чтобы проверить эти данные:
SELECT * FROM users WHERE username = 'Имя' AND password = 'Пароль';
Если сервер найдет пользователя с таким логином и паролем, он вас пустит. Но хакер не вводит стандартные данные, — например, в поле логина он пишет:
' OR 1=1 --
Пароль он оставляет пустым. В результате на стороне сервера формируется такой запрос:
SELECT * FROM users WHERE username = '' OR 1=1 -- 
AND password = '';
Давайте разберемся, что происходит:

  • OR 1=1 — условие, которое всегда будет правдой (1=1). Сервер «считает», что проверка прошла успешно, и выдает доступ.
  • -- — особый символ, который означает «игнорировать все, что идет дальше». Сервер просто не читает часть про AND password.
SQL-инъекция работает, если разработчик не обрабатывает пользовательский ввод. Сервер «верит» любым данным, которые вводят в форме, и вставляет их в запрос без проверки.
Скачайте карту знаний и навыков по безопасной разработке
В ней — 13 уязвимостей и технологий, которые нужно знать разработчику, чтобы писать безопасный код

Какие бывают SQL-инъекции и чем они отличаются

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

Представьте себе стандартную форму входа. Вы вводите логин и пароль, а сервер выполняет запрос, чтобы проверить данные:
SELECT * FROM users WHERE username = 'логин' AND password = 'пароль';
Хакер вводит:

Логин: admin' --
Пароль: (пустое поле)

Запрос на сервере после подстановки:
SELECT * FROM users WHERE username = 'admin' --' AND password = '';
Часть запроса после -- становится комментарием и игнорируется сервером. В результате хакер заходит в систему как пользователь admin.
Слепая SQL-инъекция
Если сервер не выводит ошибки и не отображает данные на экране, а вместо этого показывает сообщение «Ошибка» или «Доступ запрещен», используется слепая SQL-инъекция. Этот тип инъекции называется «слепой», потому что злоумышленник не получает прямого ответа от сервера и действует наугад.

Например, он хочет узнать, есть ли в базе пользователь с ID=5 и посылает запрос:
1 AND (SELECT COUNT(*) FROM users WHERE id=5)=1
Если сервер отвечает иначе, чем обычно, значит, такой пользователь существует. Процесс долгий, но он позволяет получать данные по частям.
Инъекция «UNION»
Оператор UNION объединяет результаты двух SQL-запросов. Хакер использует это, чтобы вытянуть дополнительные данные.

Допустим, вы видите страницу с товарами, которая выдает названия и цены:
SELECT name, price FROM products WHERE category_id = 1;
Но злоумышленник добавляет к URL:
1 UNION SELECT username, password FROM users --
Теперь сервер выполнит:
SELECT name, price FROM products WHERE category_id = 1
UNION
SELECT username, password FROM users;
Результат — вместе с товарами на странице выводятся логины и пароли пользователей.
Инъекция второго порядка
Этот тип атаки происходит не сразу. Здесь хакер действует хитрее: его вредоносный код сначала сохраняется в базе как обычные данные, например, в полях профиля пользователя. Затем при выполнении другого запроса, код активируется.

Допустим, сайт позволяет пользователям редактировать информацию о себе. Хакер вводит имя:
John'; DROP TABLE users;--
На момент ввода кода ничего не происходит, и администратор решает, что все в порядке. Но позже, когда администратор открывает таблицу пользователей или генерирует отчет, код срабатывает, и таблица users удаляется.

Это опасно, потому что злоумышленнику не нужно иметь полный доступ. Атака происходит через обычного пользователя.
JSON и XML-инъекция
Приложения часто работают через API и отправляют данные в формате JSON или XML.

Например, вы отправляете серверу запрос:
{
  "username": "john",
  "password": "12345"
}
Если сервер не проверяет содержимое, хакер может вставить свой код:
{
  "username": "john",
  "password": "' OR '1' = '1"
}
Этот JSON превращается в:
SELECT * FROM users WHERE username = 'user' AND password = '' OR 1=1 --';
В результате хакер получает доступ к данным без необходимости вводить пароль.

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

Телеграм-канал Start X

Подписаться
Наши разборы мошеннических схем поймет даже бабушка

Как распознать SQL-инъекцию

SQL-инъекция может оставаться незамеченной, особенно если злоумышленник действует осторожно. Но есть признаки, которые помогают выявить атаки на ранних этапах. Чем раньше разработчик обнаружит проблему, тем ниже риски серьезных последствий. Разберем основные признаки.
Ошибки базы данных на экране
Ошибки базы данных на экране — один из явных признаков SQL-инъекции. Например, если пользователь вводит что-то необычное в поисковую строку, например, ' OR 1=1 --, а вместо обычного списка товаров появляется сообщение на английском:
You have an error in your SQL syntax near '1=1'
Такое сообщение означает, что система не смогла корректно обработать введенные данные и выдала техническую ошибку. Теперь злоумышленник знает, что база уязвима и что попытка выполнить нежелательный запрос удалась.

Что делать:

  1. Отключите отображение системных ошибок пользователям.
  2. Проверьте обработку входящих данных — пользовательский ввод нельзя передавать в базу без проверки.
Резкий рост активности
Резкое увеличение нагрузки на сервер может быть признаком SQL-инъекции. Если еще вчера пользователи спокойно просматривали товары и загружали страницы, то сегодня сервер перегружен, в логах появляются сотни подозрительных запросов.

Например, встречаются такие строки:
' OR 1=1 -- 
или
' AND SLEEP(5) --  
С помощью таких запросов злоумышленник проверяет систему на уязвимости.

Что делать:

  1. Настройте мониторинг запросов. Если их количество аномально увеличилось, это может указывать на попытку атаки.
  2. Анализируйте логи на наличие подозрительных строк или нетипичных структур запросов.
Доступ к скрытым данным
SQL-инъекция может привести к тому, что пользователь увидит информацию, к которой у него нет доступа. Например, вместо списка товаров на экране появляется таблица с именами и паролями других пользователей.

Скорее всего, злоумышленник использовал запрос вроде:
' UNION SELECT username, password FROM users --
В результате вместо ожидаемых данных сервер отправляет чужие учетные записи.

Что делать:

  1. Немедленно отключите доступ к базе данных.
  2. Проверьте последние запросы, которые обрабатывал сервер, и найдите источники аномальных команд.
Странные изменения внутри базы данных
Если злоумышленник получил доступ к базе, он может начать вносить изменения: удалять, добавлять или изменять данные. Вот признаки возможной атаки:

  • Исчезли записи из таблиц.
  • В базе появились подозрительные данные — например, пользователь с именем 'DROP TABLE users; --.
  • Количество строк в таблицах неожиданно уменьшилось.
Возможно, это инъекция второго порядка. Например, злоумышленник сохранил вредоносный запрос в поле «Имя», а когда система попыталась обработать его, SQL-код активировался и удалил часть данных.

Что делать:


  1. Настройте автоматические уведомления. Если данные внезапно удаляются или изменяются в больших объемах, система сразу сообщит об этом.
  2. Проверяйте логи операций. Регулярный анализ поможет заметить подозрительные изменения.

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

Главное правило — не доверять пользовательским данным и минимизировать их влияние на SQL-запросы. Рассказываем про основные способы защиты от SQL-инъекций.
Используйте параметризованные запросы
Это самый надежный способ защиты, так как он исключает прямую вставку пользовательских данных в SQL и уменьшает вероятность выполнения вредоносного кода.

Вместо стандартной конкатенации строк, где пользовательский ввод становится частью SQL-запроса, параметры обрабатываются отдельно. Это не дает хакерскому коду попасть в основной запрос.
-- Опасный запрос:
"SELECT * FROM users WHERE username = '" + userInput + "'"

-- Параметризованный запрос:
sql = "INSERT INTO Products (ProductName, Price) VALUES (?, ?)"

rows = conn.execute(sql, productName, price).rowcount
В параметризованном запросе вместо знаков вопроса в выражения будут подставлены значения переменных productName и price, причем экранирование содержимого переменных будет выполнено автоматически.

Большинство популярных языков программирования поддерживают параметризованные запросы через встроенные библиотеки.
Используйте ORM (Object-Relational Mapping)
ORM (Object-Relational Mapping) — технология, которая позволяет работать с базой данных через объекты и методы, при этом полностью избегать написания SQL-запросов вручную.

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

В Django, популярном фреймворке для Python, таблицы базы данных представляются как модели — классы-наследники models. Mode:
from django.db import models

class Student(models.Model):
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
Для доступа к данным используются методы ORM. К примеру, чтобы получить имя студента с определенным ID, достаточно написать:
student = Student.objects.get(id=1)
print(student.first_name)
ORM преобразует этот код в безопасный SQL-запрос:
SELECT first_name, last_name FROM student WHERE id = 1;
ORM не заменяет другие меры защиты, такие как валидация данных или шифрование. Если злоумышленник попытается передать вредоносные данные через ORM-методы, они будут корректно экранированы, но дополнительные проверки на уровне приложения все равно нужны.
Проверяйте данные
Относитесь к пользовательскому вводу как к потенциально опасному. Проверка данных на этапе получения — еще один важный инструмент защиты.

Вот что особенно важно:

  • Устанавливайте ограничения. Например, имя пользователя не должно превышать 30 символов.
  • Используйте регулярные выражения, чтобы блокировать нежелательные символы.
  • Применяйте подходящие элементы интерфейса — например, числовые поля для ввода дат или чисел.
Если данные не соответствуют ожиданиям — их лучше отклонять.
Скрывайте SQL-ошибки от пользователей
Когда система «ругается» SQL-ошибками, она дает хакеру подсказку, например:
SQL syntax error near '1=1'
Так злоумышленник понимает, что доступ к базе есть, и начинает искать другие пути.

Отключите вывод ошибок на клиентской стороне. Пользователь должен видеть только общее сообщение вроде «Произошла ошибка. Пожалуйста, повторите попытку».
Шифруйте важные данные
Даже если злоумышленник получил доступ к базе, это не значит, что он сможет что-то прочитать. Добавьте еще один уровень защиты — шифрование.

Пароли нужно хэшировать с помощью специальных функций, таких как bcrypt. Никогда не храните их в открытом виде. То же самое касается и другой конфиденциальной информации: номера карт, СМС-коды и любые чувствительные данные лучше шифровать.
Ограничьте права доступа
База данных — не место для всеобщего доступа. Как в банке: не каждому сотруднику нужен ключ от сейфа.

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

  • Клиентская часть приложения — только чтение.
  • Администратор — расширенные права, защищенные паролем и доступом по IP.
  • Обычные пользователи — никаких опасных команд вроде DROP или ALTER TABLE.
Чем меньше возможностей у каждой роли, тем безопаснее ваша система.

Защититься от SQL-атак проще, чем кажется. Параметризованные запросы, использование ORM, строгая валидация и шифрование чувствительных данных — обязательные элементы безопасного приложения. Чем раньше вы внедрите эти меры, тем выше шанс предотвратить атаки и сохранить контроль над системой.

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

Что еще почитать

Мужчина в кресле с ноутбуком

Подпишитесь на дайджест Start X

Еженедельная подборка материалов и аналитики про цифровые атаки на людей, технологии защиты, безопасность инфраструктуры и приложений
Нажимая кнопку «Отправить заявку» вы соглашаетесь с политикой обработки персональных данных.