FromSqlRaw инъекция EF Core 3.0 - PullRequest
       62

FromSqlRaw инъекция EF Core 3.0

1 голос
/ 03 августа 2020

Мне интересно, насколько безопасен метод fromSqlRaw. Я делаю в своем коде следующее, где идентификатор человека является параметром самого метода:

string sql = String.Format("SELECT * FROM [users].[user] WHERE Id LIKE {0}", id)

var list = this.context.Person.FromSqlRaw<Person>(sql).ToList();

Безопасен ли этот код для SQL инъекции? И есть ли другие уязвимости безопасности, о которых я должен знать при использовании этого?

1 Ответ

3 голосов
/ 03 августа 2020

Используйте правильную параметризацию для вашего ввода.

После пояснений в комментариях кажется, что ваш параметр - строка, вводимая пользователем, это широкая дверь, открытая для атак путем инъекций.

Обычно, вы можете создать 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» была получена из параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...