0Pricing
Cyber Security Academy · Урок

Защита от SQL-инъекций

Предотвращайте атаки с внедрением

«Защита от SQL-инъекций» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.

Что такое внедрение SQL

Внедрение SQL (SQLi) происходит, когда ненадежные входные данные пользователя напрямую объединяются с SQL-запросом. Злоумышленник добавляет синтаксис SQL в поле, которое приложение ожидает получить как обычные данные, и тем самым меняет смысл запроса.

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

Уязвимый запрос

Классическая ошибка — объединение строк. Если входные данные имеют значение tom, запрос работает правильно, но специально сформированные входные данные меняют его логику.

  • Одинарная кавычка преждевременно закрывает строку.
  • Все последующее становится исполняемым SQL-кодом.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'

Обход аутентификации

Формы входа в систему — главная цель атак. Внедрив условие, которое всегда истинно, и закомментировав остальную часть запроса, злоумышленник входит без пароля.

Последовательность -- комментирует оставшееся условие, поэтому проверка пароля игнорируется.

-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'

Параметризованные запросы

Основная защита — параметризованные запросы (подготовленные выражения). Структура SQL отправляется отдельно от данных, поэтому входные данные всегда обрабатываются как значение, а не как код.

Драйвер базы данных безопасно связывает заполнители ? с переданными значениями.

-- Python (sqlite3 / psycopg)
cur.execute(
  'SELECT * FROM users WHERE name = ? AND pass = ?',
  (username, password)
)

Подготовленные выражения в Java

Все основные языки поддерживают параметризацию. В Java используйте PreparedStatement вместо построения строк с помощью Statement.

Связанные параметры не могут выйти за пределы своего места, поэтому здесь внедрение структурно невозможно.

PreparedStatement ps = conn.prepareStatement(
  "SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();

Хранимые процедуры

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

  • Безопасно: параметры передаются процедуре.
  • Небезопасно: EXEC() объединенных строк внутри процедуры.

Проверка входных данных и списки разрешенных значений

Проверка — полезный дополнительный уровень защиты. Используйте списки разрешенных значений (принимайте только заведомо допустимые шаблоны), а не списки запрещенных значений (попытки запретить небезопасные символы).

Например, поле числового ID должно отклонять все, что не состоит из цифр, еще до попадания данных в запрос.

if not user_id.isdigit():
    raise ValueError('invalid id')
# only then use the value

Экранирование — крайняя мера

Ручное экранирование кавычек ненадежно и часто приводит к ошибкам. В разных базах данных действуют разные правила экранирования, а уязвимые пограничные случаи (уловки с кодировками, инъекции второго порядка) могут остаться незамеченными.

Предпочитайте параметризованные запросы. Используйте экранирование только тогда, когда ORM-система или драйвер не может параметризовать определенный идентификатор.

Минимальные привилегии для учетных записей БД

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

  • Предоставляйте только SELECT, INSERT, UPDATE для необходимых таблиц.
  • Никогда не используйте учетную запись суперпользователя/root для приложения.
  • Запрещайте DROP, FILE и права администратора.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';

ORM-системы и конструкторы запросов

Современные ORM-системы (Hibernate, Sequelize, Django ORM, SQLAlchemy) по умолчанию используют параметризацию, что устраняет большую часть риска внедрения.

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

Многоуровневая защита

Одного средства защиты недостаточно. Объединяйте несколько уровней:

  • Параметризованные запросы повсюду (основная защита).
  • Проверка входных данных и списки разрешенных значений.
  • Учетные записи БД с минимальными привилегиями.
  • Межсетевой экран веб-приложений (WAF) для обнаружения известных шаблонов.
  • Обработка ошибок, которая никогда не раскрывает SQL или трассировки стека.

Быстрая проверка

Проверьте, насколько Вы поняли основной способ защиты.

Итоги

Вы узнали, как работает внедрение SQL и как ему противостоять:

  • SQLi возникает из-за объединения ненадежных входных данных с запросами.
  • Параметризованные запросы — основная защита.
  • Добавляйте проверку по списку разрешенных значений, учетные записи БД с минимальными привилегиями и WAF.
  • Избегайте ручного экранирования и динамического SQL внутри хранимых процедур.

Многоуровневая защита не позволяет одной ошибке перерасти во взлом.

Часто задаваемые вопросы

Урок «Защита от SQL-инъекций» бесплатный?

Да — полный текст урока «Защита от SQL-инъекций» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.

Чему я научусь в уроке «Защита от SQL-инъекций»?

Предотвращайте атаки с внедрением Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cyber Security Academy?

Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Защита от SQL-инъекций»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cyber Security Academy?

Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Защита от SQL-инъекций
  2. Контроль доступа и шифрование
  3. Аудит и мониторинг
  4. Безопасность резервного копирования и восстановления
← Назад к Cyber Security Academy