如何在此EF Core查询中避免SQL注入?

时间:2019-03-26 23:13:20

标签: c# entity-framework-core

由于EF Core当前不在数据库中执行按组查询,因此我使用以下查询来完成工作(InvoiceQueryDbQuery类型):

long merchantId = 177;
var invTokens = new List<string> {"qasas", "efsac"};
string inClause = string.Join(",", invTokens);

string query = $@"SELECT i.Token, i.Balance, COALESCE(SUM(i.Amount), 0) AS ProcessingAmount
                  FROM inv.Invoices i
                  WHERE i.Token IN ({inClause})
                    AND i.MerchantId = {merchantId} 
                    AND i.Status = {(int)InvoiceStatus.Scheduled}
                  GROUP BY i.Token, i.Balance";

return await dbContext.InvoicesQuery.FromSql(query).ToListAsync();

上面的代码运行完美,但是我不喜欢它,因为它给了我一个“可能的SQL注入漏洞”的警告。正在使用)。

我尝试传递查询并将参数提供给#pragma方法,该方法可以工作,但是FromSql子句中输入的参数未正确映射。.

尝试使用IN,但是没有用。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

从EF Core 2.0开始,您可以使用FormattableString,在其中可以将字符串插值用于查询。
String interpolation in FromSql and ExecuteSqlCommand
FormattableString Class

  

在EF Core 2.0中,我们向接受原始SQL字符串的两个主要API添加了对插值字符串的特殊支持:FromSqlExecuteSqlCommand。这种新的支持使C#字符串插值能够以“安全”的方式使用。

文档中的示例:

var city = "London";
var contactTitle = "Sales Representative";

using (var context = CreateContext())
{
    context.Set<Customer>()
        .FromSql($@"
            SELECT *
            FROM ""Customers""
            WHERE ""City"" = {city} AND
                ""ContactTitle"" = {contactTitle}")
            .ToArray();
 }

这将产生:

@p0='London' (Size = 4000)
@p1='Sales Representative' (Size = 4000)

SELECT *
FROM ""Customers""
WHERE ""City"" = @p0
    AND ""ContactTitle"" = @p1