Sobes.tech
Назад к вопросам
Junior — Middle
59

Какие меры безопасности позволяют предотвратить 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-код.

Пояснение кода:

  1. Создаётся SQL-команда с плейсхолдером @Email.
  2. Пользовательский ввод передаётся отдельно через Parameters.
  3. Драйвер базы данных сам корректно экранирует и типизирует значение.
  4. В результате СУБД получает структуру запроса и данные раздельно, поэтому инъекция не срабатывает.

Ключевые моменты:

  • Использовать параметризованные запросы вместо конкатенации строк.
  • Не собирать SQL через $"...", + или string.Format с пользовательским вводом.
  • Валидировать ввод по типу и формату, но не полагаться только на валидацию как на защиту.
  • Давать приложению в БД минимально необходимые права.
  • Для динамических частей запроса, которые нельзя параметризовать, применять белые списки значений.
  • По возможности использовать ORM или библиотеку, которая по умолчанию работает с параметрами.