🔐 SQL-инъекция — типы, примеры и защита: всё что нужно знать аналитику:
Один из вопросов, который может быть на собесе - это что такое "SQL-инъекция".
Давайте разберёмся, как обычно с кодом и без воды.
🟢 Как работает атака:
Бэкенд строит запрос прямо из того, что ввёл пользователь:
SELECT * FROM users
WHERE username = 'ВВОД' AND password = 'ВВОД';
Кавычки вокруг ввода уже вшиты в шаблон кода. Злоумышленник вводит admin' -- и запрос превращается в:
WHERE username = 'admin' --' AND password = '...';
Левая кавычка уже есть в шаблоне — злоумышленник дописывает только закрывающую '. Она обрывает строку досрочно, -- превращает всё остальное в комментарий. Проверка пароля выброшена — вход открыт.
🟢 3 основных типа SQL-инъекций:
1️⃣ Классическая — результат виден прямо в ответе сайта. Самый простой случай как выше.
2️⃣ Слепая (Blind) — сайт не выводит данные, но страница реагирует по-разному. Злоумышленник добавляет условие через AND к рабочему запросу:
SELECT * FROM products WHERE id = 1
AND SUBSTRING(password, 1, 1) = 'a'
Если буква угадана → TRUE AND TRUE → товар найден → страница загрузилась Если не угадана → TRUE AND FALSE → товар не найден → страница пустая
По реакции страницы злоумышленник понимает верна ли буква — как игра «горячо-холодно». Перебирает символ за символом.
3️⃣ Через UNION — дописывает свой SELECT к оригинальному и вытаскивает данные из любой таблицы. Структуру БД знать заранее не нужно — она вытаскивается через information_schema, системный справочник который есть в каждой БД:
-- Шаг 1: узнать все таблицы
' UNION SELECT table_name, null FROM information_schema.tables --
-- Шаг 2: узнать поля нужной таблицы
' UNION SELECT column_name, null FROM information_schema.columns
WHERE table_name = 'users' --
-- Шаг 3: вытащить данные
' UNION SELECT username, password FROM users --
🟢 Как защититься:
Без защиты Python склеивает строку и отдаёт в БД целиком — данные и команды уже неразличимы:
# ПЛОХО
query = "SELECT * FROM users WHERE username = '" + username + "'"
С параметрами шаблон и данные уходят в БД раздельно:
# ХОРОШО
cursor.execute(
"SELECT * FROM users WHERE username = %s",
(username,)
)
БД сначала получает шаблон → разбирает и фиксирует структуру запроса. Потом получает данные — и воспринимает их только как текст для поиска. Апостроф внутри admin' -- уже просто символ, а не SQL-синтаксис — структура зафиксирована и данные её изменить не могут.
🟢 Ответ на собесе — коротко:
Итог: 🤩
❓ Спрашивали про SQL-инъекцию на вашем собесе? Пишите в комментарии!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
Один из вопросов, который может быть на собесе - это что такое "SQL-инъекция".
Давайте разберёмся, как обычно с кодом и без воды.
🟢 Как работает атака:
Бэкенд строит запрос прямо из того, что ввёл пользователь:
SELECT * FROM users
WHERE username = 'ВВОД' AND password = 'ВВОД';
Кавычки вокруг ввода уже вшиты в шаблон кода. Злоумышленник вводит admin' -- и запрос превращается в:
WHERE username = 'admin' --' AND password = '...';
Левая кавычка уже есть в шаблоне — злоумышленник дописывает только закрывающую '. Она обрывает строку досрочно, -- превращает всё остальное в комментарий. Проверка пароля выброшена — вход открыт.
🟢 3 основных типа SQL-инъекций:
1️⃣ Классическая — результат виден прямо в ответе сайта. Самый простой случай как выше.
2️⃣ Слепая (Blind) — сайт не выводит данные, но страница реагирует по-разному. Злоумышленник добавляет условие через AND к рабочему запросу:
SELECT * FROM products WHERE id = 1
AND SUBSTRING(password, 1, 1) = 'a'
Если буква угадана → TRUE AND TRUE → товар найден → страница загрузилась Если не угадана → TRUE AND FALSE → товар не найден → страница пустая
По реакции страницы злоумышленник понимает верна ли буква — как игра «горячо-холодно». Перебирает символ за символом.
3️⃣ Через UNION — дописывает свой SELECT к оригинальному и вытаскивает данные из любой таблицы. Структуру БД знать заранее не нужно — она вытаскивается через information_schema, системный справочник который есть в каждой БД:
-- Шаг 1: узнать все таблицы
' UNION SELECT table_name, null FROM information_schema.tables --
-- Шаг 2: узнать поля нужной таблицы
' UNION SELECT column_name, null FROM information_schema.columns
WHERE table_name = 'users' --
-- Шаг 3: вытащить данные
' UNION SELECT username, password FROM users --
🟢 Как защититься:
Без защиты Python склеивает строку и отдаёт в БД целиком — данные и команды уже неразличимы:
# ПЛОХО
query = "SELECT * FROM users WHERE username = '" + username + "'"
С параметрами шаблон и данные уходят в БД раздельно:
# ХОРОШО
cursor.execute(
"SELECT * FROM users WHERE username = %s",
(username,)
)
БД сначала получает шаблон → разбирает и фиксирует структуру запроса. Потом получает данные — и воспринимает их только как текст для поиска. Апостроф внутри admin' -- уже просто символ, а не SQL-синтаксис — структура зафиксирована и данные её изменить не могут.
🟢 Ответ на собесе — коротко:
«SQL-инъекция — это вид атаки, когда пользовательский ввод попадает напрямую в строку SQL-запроса и исполняется как код. Защита — параметризованные запросы: шаблон и данные идут в БД раздельно, поэтому данные никогда не интерпретируются как SQL-команды.»
Итог: 🤩
❓ Спрашивали про SQL-инъекцию на вашем собесе? Пишите в комментарии!
✔️ Подпишитесь на канал, чтобы не пропустить следующие посты.
🚬 Вопросы, менторство, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit