vibecode.wiki
RU EN
~/wiki / bezopasnost / sql-inejsii

SQL-инъекции в 2026: как они работают и как заставить ИИ писать по-настоящему безопасный код

Следующий шаг

Открой бота или продолжай маршрут внутри раздела.

$ cd раздел/ $ open @mmorecil_bot

Статья -> план в ИИ

Отправь ссылку на эту статью в любой ИИ и получи план внедрения под свой проект.

Прочитай эту статью: https://vibecode.morecil.ru/ru/bezopasnost/sql-inejsii/ Работай в контексте моего текущего проекта. Сделай план внедрения под мой стек: 1) что изменить 2) в каких файлах 3) риски и типичные ошибки 4) как проверить, что всё работает Если есть варианты, дай "быстрый" и "production-ready".
Как использовать
  1. Скопируй этот промпт и отправь в чат с ИИ.
  2. Прикрепи проект или открой папку репозитория в ИИ-инструменте.
  3. Попроси изменения по файлам, риски и короткий чеклист проверки.

SQL-инъекция остаётся одной из самых опасных и при этом самых примитивных уязвимостей в веб-разработке. Она не требует «магии» — только неосторожной строки кода, где пользовательский ввод напрямую попадает в SQL-запрос. Последствия могут варьироваться от утечки данных до полного уничтожения базы.

Несмотря на развитие фреймворков и ORM, проблема не исчезла. Причина проста: скорость разработки выросла, особенно с приходом ИИ. Модели генерируют код быстро, но без явных требований к безопасности они легко создают уязвимые конструкции.

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

1. Что такое SQL-инъекция (простыми словами)

Представь: ты пишешь запрос к базе:

sql
SELECT * FROM users WHERE login = 'введённый_логин';

Пользователь вместо логина вводит:

code
admin' OR '1'='1

Запрос превращается в:

sql
SELECT * FROM users WHERE login = 'admin' OR '1'='1';

База отдаёт ВСЕХ пользователей. Добро пожаловать в классическую SQL-инъекцию.

Это не баг базы данных. Это баг твоего кода, который позволил пользователю «вмешаться» в SQL-запрос.

Реальные последствия:

  • Утечка миллионов паролей (вспомни Yahoo, LinkedIn, Sony).
  • Полное удаление таблиц (DROP TABLE users).
  • Чтение файлов сервера (LOAD_FILE('/etc/passwd')).
  • Захват сервера через xp_cmdshell (в старых MSSQL).

Даже в 2026 году OWASP ставит Injection на 1-е место в Top 10.

2. Как это выглядит на практике (примеры уязвимого кода)

Плохой код:

Python + psycopg2

python
# ❌ ОПАСНО!
query = f"SELECT * FROM users WHERE email = '{user_email}'"
cur.execute(query)

Node.js

js
// ❌ ОПАСНО!
const query = `SELECT * FROM bots WHERE token = '${token}'`;

PHP

php
// ❌ Классика 2010-х
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];

Хакер в поле «email» пишет: ' OR '1'='1 — и готово.

3. Виды SQL-инъекций

  1. Classic (Error-based) — база ругается ошибкой и выдаёт данные.
  2. Union-basedUNION SELECT password FROM users (самая популярная).
  3. Blind (Boolean/Time-based) — запросы типа AND (SELECT 1)=1 или AND SLEEP(5).
  4. Out-of-band — данные уходят на сервер хакера через DNS.
  5. Second-order — инъекция срабатывает позже (например, при сохранении в базу и последующем чтении).

4. Как хакеры находят уязвимость

Самый популярный инструмент — sqlmap.

Промт для ИИ (чтобы он сам настроил тебе sqlmap):

code
Напиши пошаговый план установки и запуска sqlmap против моего тестового эндпоинта /login?email= на локалхосте. Используй --risk=3 --level=5 --batch. Покажи команду для теста формы логина.

Запусти — и увидишь красные строки «[CRITICAL] parameter 'email' is vulnerable».

5. Главная защита: Параметризованные запросы (Prepared Statements)

Это единственный 100% способ закрыть SQL-инъекции на уровне кода.

Как это работает: База сначала получает «шаблон» запроса, потом отдельно — данные. Данные никогда не становятся кодом.

6. Готовые решения

Вариант А — ORM (рекомендую для новичков)

  • Prisma (Node.js / TypeScript) — просто мечта.
  • SQLAlchemy 2.0 (Python) — с async.
  • Drizzle ORM (TypeScript) — лёгкий и быстрый.
  • GORM (Go) — если вдруг.

Промт для Claude/GPT (универсальный):

code
Напиши полный код авторизации пользователя в Telegram-боте на Python + aiogram 3 + SQLAlchemy 2.0 + asyncpg (PostgreSQL/Supabase).
Обязательно используй parameterized queries (не f-строки!).
Добавь валидацию email через Pydantic.
Добавь rate-limit 5 попыток в минуту.
Сделай код максимально безопасным и с комментариями для новичка.

Вариант Б — ручные prepared statements

Python + psycopg2 (Supabase)

python
cur.execute(
    "SELECT * FROM users WHERE email = %s AND password = %s",
    (email, hashed_password)
)

Node.js + pg

js
const { rows } = await pool.query(
    'SELECT * FROM users WHERE email = $1',
    [email]
);

PHP + PDO

php
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$email]);

7. Дополнительные уровни защиты (defense in depth)

  1. Валидация и санитизация ввода

    • Регулярки + whitelist.
    • Zod / Pydantic / Joi.
  2. Принцип наименьших привилегий

    • Создай отдельного пользователя базы ТОЛЬКО с правами SELECT/INSERT/UPDATE на нужные таблицы.
    • Никогда не используй postgres или root в приложении.
  3. Web Application Firewall (WAF)

    • Cloudflare WAF (бесплатно до 100к запросов).
    • ModSecurity + OWASP CRS.
    • Supabase имеет встроенную защиту.
  4. Хранимые процедуры (с параметрами!)

  5. ORM + Prepared Statements = почти невозможно ошибиться.

8. Как просить ИИ писать безопасный код

Универсальный промт-шаблон:

code
Напиши код для [функция, например: регистрация пользователя].
Обязательные требования:
- Использовать ТОЛЬКО parameterized queries / ORM
- Никогда не конкатенировать строки в SQL
- Валидация через [Zod/Pydantic]
- Rate limiting
- Хэширование паролей через bcrypt/argon2
- Комментарии "// SECURITY:" для каждой защитной меры
- Защита от SQLi, XSS, CSRF

9. Чек-лист перед деплоем

  • Все SQL-запросы параметризованы?
  • Пользователь БД имеет минимальные права?
  • Валидация + санитизация на всех входах?
  • Запущен sqlmap-тест?
  • WAF включён?
  • Логирование подозрительных запросов?
  • Регулярные обновления зависимостей (npm audit, pip-audit)?

10. Что делать, если уже взломали

  1. Отключи приложение.
  2. Смени все пароли и токены.
  3. Восстанови из чистого бэкапа.
  4. Проведи аудит кода.
  5. Добавь все защиты выше.
  6. Сообщи пользователям (по закону).

Заключение

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

Сейчас, в эпоху ИИ, ты можешь писать код быстрее всех — но только если научишь ИИ писать безопасно.