Является ли метод ExecuteSqlRawAsync с параметризованным запросом в ASP .NET Core подходящим способом предотвращения атак с использованием SQL-инъекций?

Это параметризованный запрос:

string sqlQuery = @"UPDATE MyTable 
                    SET MyTableItemName = @newName 
                    WHERE MyTableItemId = @id;";

await _context.Database.ExecuteSqlRawAsync(
                sqlQuery,
                new SqlParameter("@newName", "Test name"),
                new SqlParameter("@id", 1));

Если параметры будут поступать со стороны клиента, предотвратит ли этот запрос атаки с использованием SQL-инъекций?

Если нет, что может быть альтернативой, кроме использования запросов LINQ?

вы могли бы просто прочитать этот документ Learn.microsoft.com/en-us/dotnet/api/…

T.S. 11.07.2024 02:40

Почему? Когда вместо этого вы можете использовать ExecuteSqlInterpolatedAsync (не то чтобы это каким-либо образом меняло безопасность).

Jeremy Lakeman 11.07.2024 03:34

По какой причине вы не используете ExecuteUpdateAsync для этого конкретного запроса?

Charlieface 11.07.2024 11:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Является ли метод ExecuteSqlRawAsync с параметризованным запросом в ASP .NET Core? правильный способ предотвращения атак с использованием SQL-инъекций?

Судя по вашему сценарию и описанию, да, метод ExecuteSqlRawAsync с параметризованными запросами, как показано в вашем примере, является правильным способом предотвращения атак SQL-инъекций в ASP.NET Core. Параметризованные запросы гарантируют, что вводимые пользователем данные обрабатываются как данные, а не как исполняемый код, что эффективно предотвращает внедрение вредоносного кода SQL.

Однако метод ExecuteSqlRawAsync или FromSqlRaw может быть уязвим для атак SQL-инъекций, если вы не можете использовать их правильно.

Когда говорят «используйте их правильно», это означает, что они должны быть параметризованы и очищены от свойств.

Поэтому, чтобы преодолеть эту проблему, в EF core 7.0 были введены FromSql и FromSqlInterpolated . Эти методы более безопасны против SQL-инъекций и всегда интегрируют данные параметров как отдельный параметр SQL подробности можно посмотреть здесь.

Если параметры будут поступать со стороны клиента, предотвратит ли этот запрос атаки с использованием SQL-инъекций?

Да, это будет. Подход, который вы описали с объектами ExecuteSqlRawAsync и SqlParameter, эффективно предотвращает атаки SQL-инъекций, даже если параметры поступают из источников на стороне клиента.

Но убедитесь, что объекты, полученные от SqlParameter, обрабатывают привязку значений и входные данные, очищены и правильно отформатированы перед отправкой на сервер базы данных.

Если нет, что может быть альтернативой, кроме использования запросов LINQ?

В качестве альтернативы можно использовать запросы LINQ или методы, предоставляемые EF Core (DbContext и его свойства DbSet) для создания запросов. EF Core автоматически параметризует запросы при использовании методов LINQ, предоставляя уровень ORM (объектно-реляционное сопоставление), который абстрагирует взаимодействия SQL.

Фрагмент кода, которым вы поделились, можно преобразовать в следующий linq, который сделает то же самое.

var entity = await _context.MyTable.FirstOrDefaultAsync(e => e.MyTableItemId == id);
if (entity != null)
{
    entity.MyTableItemName = newName;
    await _context.SaveChangesAsync();
}

Реальный пример кода:

public async Task UpdateUserName(string userId, string newUserName)
 {
     var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == userId);

     if (user != null)
     {
         user.UserName = newUserName;
         await _context.SaveChangesAsync();
     }
     else
     {
         throw new Exception($"User with ID {userId} not found.");
     }
 }

Выход:

Примечание. Если вам нужна дополнительная информация, обратитесь к этому официальному документу.

Другие вопросы по теме