Короткий ответ
Основная защита — параметризованные запросы и безопасные API, которые передают код и данные раздельно. Валидация, минимальные права и изоляция уменьшают риск, но ручное экранирование не должно быть главным механизмом.
Где возникает ввод
Источник — не только поле формы. Заголовки, JSON, имя файла, значение cookie, импортированный CSV и данные другого сервиса тоже недоверенны на границе компонента.
Почему allowlist лучше
Если ожидается число, UUID или одно из нескольких действий, проверяйте именно этот формат. Запрет нескольких опасных символов легко обходится кодировками и новым синтаксисом.
Проверка исправления
Добавьте автоматический тест с метасимволами и убедитесь, что запрос остаётся данными. Одновременно проверьте, что аккаунт базы не может изменять лишние таблицы или выполнять системные команды.
Чек-лист действий
- Найдите все границы недоверенного ввода.
- Используйте подготовленные запросы.
- Ограничьте допустимый формат данных.
- Выдайте сервису минимальные права.
- Добавьте негативные тесты.
Что часто делают неправильно
- Собирать SQL конкатенацией строк.
- Экранировать ввод одной самописной функцией.
- Доверять данным из внутреннего API.
- Показывать пользователю полный текст ошибки базы.