Когда пользовательский текст становится командой для базы данных

База данных не знает, что строку ввёл человек, а не написал разработчик. Она получает запрос и разбирает его по правилам языка SQL: одни части задают действие, другие — значения, с которыми это действие выполняется. Опасность возникает, когда приложение склеивает запрос из текста программы и непроверенного ввода. Тогда ввод может изменить структуру запроса: база увидит в нём не просто данные, а продолжение команды.

`DROP TABLE` — SQL-команда удаления таблицы, то есть набора данных вроде списка пользователей. Но сама по себе эта последовательность букв ничего не удаляет: она сработает лишь в том случае, если приложение передаст её базе как исполняемую команду, а учётная запись приложения получит право на такое удаление. Некоторые настройки драйверов и баз также могут блокировать выполнение нескольких команд за один запрос.

Как отделяют текст от инструкции

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

Простая проверка на запрещённые слова надёжной защитой не считается: опасная строка может быть записана иначе, а допустимый пользовательский текст может случайно содержать похожие символы. Параметры решают проблему на уровне разделения кода и данных. Дополнительно приложению дают только те права, которые ему действительно нужны: если его учётная запись не может удалять таблицы, такая команда не выполнится даже при ошибке в обработке ввода.

Почему важны права и восстановление

Если таблица всё-таки удалена, последствия зависят от того, какие операции разрешены приложению и как устроено хранение данных. Ограниченные права могут превратить катастрофическое удаление в неудавшийся запрос; резервные копии помогают вернуть данные, но не предотвращают сам инцидент. Поэтому защита строится слоями: сначала ввод не должен менять смысл запроса, а затем у приложения не должно быть лишних полномочий.