Используйте правильную параметризацию для вашего ввода.
После пояснений в комментариях кажется, что ваш параметр - строка, вводимая пользователем, это широкая дверь, открытая для атак путем инъекций.
Обычно, вы можете создать SqlCommand
и указать в нем некоторые SqlParameter
.
В EFCore, FromSqlRaw
и FromSqlInterpolated
(в 3.0, замена на FromSql
в EFCore <3.0) позволяют сократить этот синтаксис, см. Документацию <a href="https://docs.microsoft.com/en-us/ef/core/querying/raw-sql" rel="nofollow noreferrer"> .
string sql = "SELECT * FROM [users].[user] WHERE Id LIKE {0}"
var list = this.context.Person.FromSqlRaw<Person>(sql, "42")
Обратите внимание, что это очень похоже на то, что вы сделали в вопросе ... Но разница явно подчеркнуто в документации:
Предупреждение
Всегда используйте параметризацию для необработанных SQL запросов
При добавлении любых значений, предоставленных пользователем, в необработанный SQL запрос , необходимо соблюдать осторожность, чтобы избежать атак с помощью инъекций SQL. В дополнение к проверке того, что такие значения не содержат недопустимые символы, всегда используйте параметризацию, которая отправляет значения отдельно от текста SQL.
В частности, никогда не передавайте объединенную или интерполированную строку ($ "") с непроверенными значениями, предоставленными пользователем, в FromSqlRaw или ExecuteSqlRaw . Методы FromSqlInterpolated и ExecuteSqlInterpolated позволяют использовать синтаксис интерполяции строк таким образом, чтобы защитить от атак SQL инъекций.
Действительно, в вашем случае строка была сначала интерполирована как строка (без всякого здравого смысла - check), затем выполняется как есть.
FromSqlRaw
понятия не имел, что часть «Id» была получена из параметра.