Entity Framework Core 2.0 FromSql 和 SQL 注入
Entity Framework Core 2.0 FromSql and 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}";
}
问题是这个 return 是一个简单的字符串,不会是字符串插值。我怎样才能正确地做到这一点?
如果您采用以下格式,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())
可能是 better/cleaner 的方式,但应该可行。
我对这个问题的解决方案是 VS 扩展,QueryFirst。 QueryFirst 为 sql 生成一个位于 .sql 文件中的 C# 包装器。因此,参数是将数据输入查询的唯一方法,SQL 注入几乎是不可能的。还有许多其他优点:您可以在真实环境中编辑 sql,它会不断针对您的数据库进行验证,并且在您的代码中使用您的查询非常简单。
我需要知道在使用 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}";
}
问题是这个 return 是一个简单的字符串,不会是字符串插值。我怎样才能正确地做到这一点?
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())
可能是 better/cleaner 的方式,但应该可行。
我对这个问题的解决方案是 VS 扩展,QueryFirst。 QueryFirst 为 sql 生成一个位于 .sql 文件中的 C# 包装器。因此,参数是将数据输入查询的唯一方法,SQL 注入几乎是不可能的。还有许多其他优点:您可以在真实环境中编辑 sql,它会不断针对您的数据库进行验证,并且在您的代码中使用您的查询非常简单。