Список безопасных приёмов работы с SQL

🟢 Безопасные приемы в SQL. Введение

SQL — мощный язык для работы с данными. Эта статья — практический список приёмов безопасной
работы с SQL с примерами кода и чек-листами. В конце — свод правил.

К чему приводит небезопасный SQL

ПроблемаРискРешение
SQL-инъекция из-за конкатенации строкКража/модификация данныхПараметризация запросов/ORM, валидация
Избыточные права (GRANT ALL)Случайные/злонамеренные измененияРолевые модели, наименьшие привилегии
Нет ограничений схемыНеконсистентность, каскады ошибокNOT NULL, CHECK, UNIQUE, FK
Нет шифрованияПерехват трафика, утечкиTLS, TDE/pgcrypto, KMS/Vault
Операции без WHEREМассовые инцидентыWHERE, LIMIT, транзакции, RLS
Старые версии СУБДЭксплуатация CVEОбновления/патчи
Нет аудита/логовНельзя расследоватьАудит, централизованный логинг

Антипаттерны и безопасные альтернативы

НебезопасноБезопасноКомментарий
query = "SELECT * FROM users WHERE id=" + userInput
cursor.execute("SELECT * FROM users WHERE id = %s", (userInput,))
Только параметризация, никаких конкатенаций.
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'
GRANT SELECT ON app_db.* TO 'report'@'10.%'
Минимально необходимые права.
SELECT * FROM accounts;
SELECT id, login, email FROM accounts;
Запрашивайте только нужные поля.
DELETE FROM orders;
DELETE FROM orders WHERE status = 'test';
Всегда с WHERE и поэтапно.
INSERT INTO users(login, password) VALUES ('admin','123456');
INSERT INTO users(login, password_hash, salt) VALUES ('admin', hash, salt);
Пароли — только хэш + соль.

Параметризация во всех слоях


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

await client.query("SELECT * FROM users WHERE id = $1", [id]);

PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id=?");
ps.setInt(1, id);

$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([':name' => $_GET['name']]);

Роли и права


CREATE ROLE app_ro; GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_ro;
CREATE ROLE app_rw; GRANT app_ro TO app_rw; GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_rw;
GRANT app_rw TO app_user;

Ограничения схемы


CREATE TABLE accounts (
  id BIGSERIAL PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  password_hash BYTEA NOT NULL
);

Чек-лист правил безопасной работы

  1. Параметризация запросов, никаких конкатенаций.
  2. Минимально необходимые права и роли.
  3. Ограничения схемы: NOT NULL, CHECK, UNIQUE, FK.
  4. Операции только с WHERE/LIMIT, транзакции.
  5. Шифрование соединений и конфиденциальных данных.
  6. Хранение секретов в KMS/Vault, не в коде.
  7. Логи и аудит, алерты на аномалии.
  8. Регулярные обновления СУБД/драйверов.
  9. Миграции под контролем, проверка бэкапов.
  10. Изоляция окружений.

 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии