【问题标题】:How to construct a raw SQL Query in EF Core with dynamic number of parameters如何在 EF Core 中使用动态数量的参数构造原始 SQL 查询
【发布时间】:2019-05-29 15:31:57
【问题描述】:

我正在尝试动态构造一个具有 X 个条件的原始 SQL 查询。我正在使用此页面上的信息: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 注入吗?

【问题讨论】:

标签: c# sql linq entity-framework-core


【解决方案1】:

可以将查询参数化,建立一个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();

【讨论】:

  • 你能“改变”表格吗?前context.GetTable(tableName) .FromSql(rawQuery.ToString(), sqlParameters) .ToList();(我不知道GetTable会是什么样子......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多