Как построить необработанный SQL-запрос в EF Core с динамическим числом параметров - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь динамически создать необработанный SQL-запрос, который будет иметь X число условий. Я работаю с информацией на этой странице: https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

В настоящее время у меня есть что-то похожее на это:

String rawQuery = "SELECT * FROM ItemsTable WHERE ";

foreach (f in FilterList) {
  rawQuery = rawQuery + String.Format(f.condition, f.userInput);
  // f.condition is something like "Name LIKE {0}"
}

var filteredItems = context.ItemsTable
  .FromSql(rawQuery)
  .ToList();

Проблема в том, что мои параметры не подставляются при использовании .FromSql (), поэтому я уязвим для атак с использованием SQL-инъекций.

Есть ли способ использовать .FromSql () для этой задачи?

ИЛИ, Есть ли другой способ защиты от внедрения SQL?

1 Ответ

0 голосов
/ 03 января 2019

Вы можете сделать запрос параметризованным, построить список SqlParameters, а затем передать запрос и параметры в FromSql():

var rawQuery = new StringBuilder("SELECT * FROM ItemsTable WHERE ");
var sqlParameters = new List<SqlParameter>();

foreach (var f in FilterList) {
  var parameterName = $"@p{FilterList.IndexOf(f)}";
  var parameterizedCondition = string.Format(f.condition, parameterName);
  // f.condition is something like "Name LIKE {0}"

  rawQuery.Append(parameterizedCondition);
  sqlParameters.Add(new SqlParameter(parameterName, f.userInput));
}

var filteredItems = context.ItemsTable
  .FromSql(rawQuery.ToString(), sqlParameters)
  .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...