← Назад к вопросам

Как защититься от SQL-инъекций в веб-приложении?

2.0 Middle🔥 171 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Защита от SQL-инъекций в веб-приложениях

SQL-инъекция — это одна из наиболее критичных уязвимостей веб-приложений, позволяющая злоумышленнику выполнять произвольные SQL-запросы к базе данных. Для защиты в C# Backend приложениях применяется комплексный подход, основанный на принципах безопасного кодирования и использовании специальных технологий.

Основные методы защиты

1. Использование параметризованных запросов (Prepared Statements)

Это основной и самый эффективный способ. Параметры отделяются от текста запроса, что исключает интерпретацию пользовательского ввода как части SQL-команды.

using (var connection = new SqlConnection(connectionString))
{
    var command = new SqlCommand("SELECT * FROM Users WHERE Username = @username AND PasswordHash = @password", connection);
    command.Parameters.AddWithValue("@username", userInputName);
    command.Parameters.AddWithValue("@password", hashedPassword);
    // Выполнение команды
}

2. Хранимые процедуры

Использование хранимых процедур также обеспечивает параметризацию, но дополнительно ограничивает потенциально опасные операции правами доступа.

using (var connection = new SqlConnection(connectionString))
{
    var command = new SqlCommand("sp_GetUserByCredentials", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.AddWithValue("@UserName", username);
    command.Parameters.AddWithValue("@PasswordHash", passwordHash);
    // Выполнение
}

3. ORM (Object-Relational Mapping) с параметризацией

Современные ORM, такие как Entity Framework Core, автоматически параметризуют запросы.

// Entity Framework Core - безопасно
var user = context.Users
    .Where(u => u.Username == userInputName && u.PasswordHash == inputHash)
    .FirstOrDefault();

// Dapper с параметрами
var user = connection.Query<User>(
    "SELECT * FROM Users WHERE Username = @username",
    new { username = userInputName });

4. Валидация и санация входных данных

  • Бесполезно как основной метод, но полезно как дополнительный рубеж
  • Проверка формата (регулярные выражения для email, телефонов)
  • Ограничение длины вводимых данных
  • Не полагаться на замену "опасных" символов (', ;, --)

5. Принцип минимальных привилегий

  • Запуск приложения под учётной записью с ограниченными правами
  • Запрет на выполнение системных команд (xp_cmdshell)
  • Разделение прав: только необходимые SELECT, INSERT, UPDATE, DELETE

Дополнительные меры безопасности

Защита на уровне инфраструктуры:

  • Web Application Firewall (WAF) — фильтрация вредоносных запросов
  • Регулярное обновление СУБД и патчи безопасности
  • Шифрование конфиденциальных данных в БД
  • Логирование и мониторинг подозрительных запросов

Практики разработки:

  • Статический анализ кода с использованием SonarQube, Roslyn Analyzers
  • Регулярное тестирование на проникновение
  • Использование готовых библиотек вместо написания SQL вручную
  • Обучение разработчиков принципам безопасного кодирования

Пример уязвимого и безопасного кода

// ОПАСНО - подвержено SQL-инъекциям
string query = "SELECT * FROM Users WHERE Username = '" + txtUsername.Text + "'";
var command = new SqlCommand(query, connection);

// БЕЗОПАСНО - параметризованный запрос
string query = "SELECT * FROM Users WHERE Username = @username";
var command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@username", txtUsername.Text);

Современные фреймворки и их защита

ASP.NET Core предоставляет встроенные механизмы:

  • Автоматическая экранизация в Razor Pages
  • Валидация моделей с Data Annotations
  • Защита от XSS, которая косвенно помогает против SQLi

Entity Framework Core:

  • LINQ-запросы компилируются в параметризованный SQL
  • Raw SQL методы (FromSqlRaw) требуют явного указания параметров
// Безопасное использование сырого SQL в EF Core
var users = context.Users
    .FromSqlRaw("SELECT * FROM Users WHERE Age > {0}", minAge)
    .ToList();

Заключение

Защита от SQL-инъекций должна быть многоуровневой: от корректного использования параметризованных запросов на уровне кода до настройки прав доступа к базе данных и мониторинга в production-среде. Entity Framework Core и другие современные ORM значительно снижают риски, но не отменяют необходимости понимать принципы безопасной работы с базами данных. Регулярный аудит кода, тестирование безопасности и следование принципу наименьших привилегий — обязательные компоненты защищённого веб-приложения.