实体框架核心2.0 FromSql和SQL注入

时间:2018-10-24 16:24:42

标签: entity-framework .net-core sql-injection

我需要知道使用FromSQL命令时处理SQL注入的正确方法。

在运行时,我需要动态创建一个where语句。所以我正在使用FromSql创建SQL命令。现在我知道使用使用字符串插值法是可行的。但是,我需要逐步浏览“ Where Parameters”列表以生成命令。做起来很简单;

foreach (var x in wp)
{
    if (!string.IsNullOrEmpty(results))
        results = $"{results} and {x.Field} = {x.Value}";
    if (string.IsNullOrEmpty(results))
       results = $"where {x.Field} = {x.Value}";
}

问题是这将返回一个简单的字符串,而不是字符串插值。如何正确执行此操作?

2 个答案:

答案 0 :(得分:1)

如果采用以下格式,Entityframework将参数化您的查询:

db.something.FromSql("SELECT * FROM yourTable WHERE AuthorId = {0}", id)

x.Field是否是具有固定数量可能性的表单字段?即标题,名字等。如果是这样,则类似以下内容:

        var sqlstring = new StringBuilder();
        var sqlp = new List<SqlParameter>();

        var i = 0;
        foreach (var x in wp)
        {
            var param = "@param" + i.ToString();
            if (i!=0)
            {
                sqlstring.Append($" AND {x.Field} = " + param);
                sqlp.Add(new SqlParameter(param, x.Value));
            }
            if (i==0)
            {
                sqlstring.Append($"WHERE {x.Field} = " + " @param" + i.ToString());
                sqlp.Add(new SqlParameter(param, x.Value));
            }
            i++;
        }

然后您需要执行以下操作:

db.something.FromSql(sqlstring.ToString(), sqlp.ToArray())

可能是更好/更干净的方法,但是应该可以。

答案 1 :(得分:1)

我对这个问题的解决方案是VS扩展QueryFirst。 QueryFirst为驻留在.sql文件中的sql生成C#包装器。因此,参数是将数据输入查询的唯一方法,而SQL注入几乎是不可能的。还有许多其他优点:您可以在真实的环境中编辑sql,并根据数据库对其进行不断验证,并且在代码中使用查询非常简单。