Защита от 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 — локальная установка не требуется.
Все уроки этого курса
- Защита от SQL-инъекций
- Контроль доступа и шифрование
- Аудит и мониторинг
- Безопасность резервного копирования и восстановления