Это параметризованный запрос:
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?
Почему? Когда вместо этого вы можете использовать ExecuteSqlInterpolatedAsync (не то чтобы это каким-либо образом меняло безопасность).
По какой причине вы не используете ExecuteUpdateAsync для этого конкретного запроса?





Является ли метод 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.");
}
}
Выход:
Примечание. Если вам нужна дополнительная информация, обратитесь к этому официальному документу.
вы могли бы просто прочитать этот документ Learn.microsoft.com/en-us/dotnet/api/…