Почему нужно экранировать параметры из фронта в SQL-запросах?
Что проверяют
Различаете ли вы экранирование и параметризацию. Правильный ответ спорит с формулировкой вопроса: экранировать руками не надо, надо передавать значения параметрами. Ещё смотрят, знаете ли вы, что параметризуется не всякая часть запроса.
Как отвечать
Скажите, в чём суть инъекции: значение попадает в текст запроса и перестаёт быть данными, становясь кодом. Ручное экранирование кавычек ненадёжно, потому что зависит от кодировки, не работает для числовых полей и рассыпается при вложенном динамическом SQL. Параметр же уезжает отдельно от текста запроса, и сервер не может принять его за команду.
using var cmd = new SqlCommand(
"select Id, Email from Users where Email = @email", conn);
cmd.Parameters.Add("@email", SqlDbType.NVarChar, 256).Value = email;Добавьте про инструменты: Dapper и EF Core параметризуют сами, FromSqlInterpolated превращает интерполяцию в параметры, а FromSqlRaw со склеенной строкой уязвим ровно так же, как ручной ADO.NET.
И назовите границы метода. Имя таблицы, имя колонки и направление сортировки параметром не передать, там работает только сверка со списком разрешённых значений. Источник данных при этом не важен: строка, прочитанная из своей же базы, недоверенная точно так же, как поле формы, отсюда инъекции второго порядка.
Где спотыкаются
Предлагают чистить ввод чёрным списком: вырезать кавычки, двойной дефис, слово drop. Обходится это тривиально, а фамилия с апострофом перестаёт сохраняться. Фильтрация ввода нужна для форматов и длины, а не для защиты от инъекции.
Пишут AddWithValue. Тип параметра выводится из значения, строка уходит как nvarchar, сравнение с колонкой varchar даёт неявное приведение, после которого индекс не используется и запрос садится. Инъекции нет, зато есть внезапная деградация, поэтому тип и размер задают явно.
Закрывают форму и забывают всё остальное: сортировку из строки запроса, фильтры, собранные конкатенацией в репозитории, и хранимые процедуры, которые внутри сами строят текст и выполняют его. Хранимая процедура сама по себе ничего не защищает, важно только то, попадает значение в текст запроса или передаётся параметром.