Я строю поиск SQL в EF Core.Microsoft рекомендует не заключать строку в строку, поскольку она оставляет приложение уязвимым для внедрения SQL, как подробно описано в документации Microsoft: https://docs.microsoft.com/en-us/ef/core/querying/raw-sql.
Всегда использовать параметризацию для необработанных запросов SQL: В дополнение к проверке пользовательского ввода всегдаиспользуйте параметризацию для любых значений, используемых в необработанном запросе / команде SQL.API-интерфейсы, которые принимают необработанную строку SQL, такую как FromSql и ExecuteSqlCommand, позволяют легко передавать значения в качестве параметров.Перегрузки FromSql и ExecuteSqlCommand, которые принимают FormattableString, также позволяют использовать синтаксис интерполяции строк таким образом, который помогает защитить от атак внедрения SQL.
Если вы используете конкатенацию или интерполяцию строк для динамического построения любой части строки запроса, илиПередавая пользовательский ввод в операторы или хранимые процедуры, которые могут выполнять эти входные данные в виде динамического SQL, вы несете ответственность за проверку любого ввода для защиты от атак внедрения SQL.
Информация, хранящаяся в этой базе данных, не являетсячувствительный, но, очевидно, я не хотел бы оставлять уязвимую базу данных.
У меня есть параметр List<string> searchTerms
, который мне нужно перебрать и построить запрос на основе этого списка.
Яи строки вместе с моим запросом SQL, но я могу видеть только, как это сделать с конкатенацией.Прямо сейчас мой код выглядит следующим образом.
var query = String.Format("SELECT ... where MySqlField like '%{0}%'", searchTerm[0]);
for (int i = 1; i < searchTerm.Count(); i++)
{
query += String.Format(" and MySqlField like '%{0}%'", searchTerm[i]);
}
var results = context.MySqlTable.FromSql(query);
Даже если я использую интерполяцию, будет ли здесь достаточной дополнительная проверка?Я что-то упустил?
Есть ли запрос linq, который может сделать то же самое со списком?