C# 如何在这个EF核心查询中避免SQL注入?

C# 如何在这个EF核心查询中避免SQL注入?,c#,entity-framework-core,C#,Entity Framework Core,由于EF Core当前未在数据库中执行group by查询,因此我使用以下查询来完成作业InvoiceQuery是DbQuery类型: 上面的代码运行得很完美,但我不喜欢它,因为它给了我一个“可能的SQL注入漏洞”的警告。。我知道我可以使用pragma来抑制此警告,这正是我当前使用的警告 我已经尝试过传递查询并向FromSql方法提供参数,这是可行的,但是IN子句中的参数没有得到正确映射 尝试使用$'{string.Join',',invTokens}',但无效 任何帮助都将不胜感激因为EF C

由于EF Core当前未在数据库中执行group by查询,因此我使用以下查询来完成作业InvoiceQuery是DbQuery类型:

上面的代码运行得很完美,但我不喜欢它,因为它给了我一个“可能的SQL注入漏洞”的警告。。我知道我可以使用pragma来抑制此警告,这正是我当前使用的警告

我已经尝试过传递查询并向FromSql方法提供参数,这是可行的,但是IN子句中的参数没有得到正确映射

尝试使用$'{string.Join',',invTokens}',但无效


任何帮助都将不胜感激

因为EF Core 2.0,您可以使用FormattableString,其中您可以使用字符串插值进行查询。

在EF Core 2.0中,我们在接受原始SQL字符串的两个主要API中添加了对插值字符串的特殊支持:FromSql和ExecuteSqlCommand。这种新的支持允许以“安全”的方式使用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();
 }

为什么在这里使用原始SQL?这不是一个复杂的查询,你可以用Linq来完成。你读过吗?它展示了如何以多种不同的方式安全地传递参数。上面的代码运行得非常完美,我真的很惊讶查询能够成功运行,因为您没有引用单独的incluse值。运行时查询的确切值是多少?EF Core支持group by,但您需要使用v2.1或更高版本。@DavidG o:您是对的,我想group by支持将添加到3.0版本中。谢谢
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