我需要知道使用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}";
}
问题是这将返回一个简单的字符串,而不是字符串插值。如何正确执行此操作?
答案 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,并根据数据库对其进行不断验证,并且在代码中使用查询非常简单。