如何在EF Core中构建具有动态参数数量的原始SQL查询

5

我正在尝试动态构建一个原始SQL查询,其中将有X个条件。 我正在使用此页面上的信息工作:https://learn.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
请按照链接中建议的使用“传递参数”来编程。它甚至指出这样做可以防止 SQL 注入。 - Erik Philips
请参见 https://dev59.com/-lsV5IYBdhLWcg3w6yYh#AcAuoYgBc1ULPQZFaj4U。 - Michael Freidgeim
1个回答

5
您可以将查询参数化,构建一个SqlParameter列表,然后将查询和参数传递到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();

你能将表格“变量化”吗?例如:context.GetTable(tableName).FromSql(rawQuery.ToString(), sqlParameters).ToList();(我不知道GetTable看起来像什么...) - mwilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接