Какие меры безопасности позволяют предотвратить SQL-инъекции в веб-приложении?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Нужно показать, что SQL-инъекции предотвращают не одной мерой, а набором практик. Главная идея — никогда не собирать SQL из пользовательского ввода строковой конкатенацией. Ожидают упоминание параметризованных запросов, валидации ввода и принципа минимальных привилегий.
Определение:
SQL-инъекция — это атака, при которой злоумышленник подставляет в запрос к базе данных свой SQL-код через поля ввода приложения. Защита строится так, чтобы введённые данные всегда передавались как данные, а не как часть команды SQL. Для этого в C# обычно используют параметризованные запросы, ORM с безопасной параметризацией и ограничение прав учетной записи базы данных.
Пример использования:
using var connection = new SqlConnection(connectionString);
using var command = new SqlCommand(
"SELECT Id, Name FROM Users WHERE Email = @Email", connection);
command.Parameters.AddWithValue("@Email", emailFromUser);
connection.Open();
using var reader = command.ExecuteReader();
Здесь значение emailFromUser не вставляется в SQL-строку, а передаётся как параметр. Даже если пользователь введёт test@example.com' OR 1=1 --, это будет просто строковое значение, а не выполняемый SQL-код.
Пояснение кода:
- Создаётся SQL-команда с плейсхолдером
@Email. - Пользовательский ввод передаётся отдельно через
Parameters. - Драйвер базы данных сам корректно экранирует и типизирует значение.
- В результате СУБД получает структуру запроса и данные раздельно, поэтому инъекция не срабатывает.
Ключевые моменты:
- Использовать параметризованные запросы вместо конкатенации строк.
- Не собирать SQL через
$"...",+илиstring.Formatс пользовательским вводом. - Валидировать ввод по типу и формату, но не полагаться только на валидацию как на защиту.
- Давать приложению в БД минимально необходимые права.
- Для динамических частей запроса, которые нельзя параметризовать, применять белые списки значений.
- По возможности использовать ORM или библиотеку, которая по умолчанию работает с параметрами.