最近,我正在通过DataView以下列方式对数据表进行过滤:
public static DataTable FilterDatatable(this DataTable dtable,string @operator, string colName, string colValue)
{
if (dtable != null && dtable.Rows.Count > 0)
{
DataView dataView = dtable.DefaultView;
if (@operator.Equals(SqlOperator.Like , StringComparison.InvariantCultureIgnoreCase))
{
dataView.RowFilter = colName + " " + @operator + " '%" + colValue + "%'";
}
else
{
dataView.RowFilter = colName + " " + @operator + " " + colValue;
}
return dataView.ToTable();
}
return dtable;
}
在这里,我可以编写一种防止注入的方法(我知道那些注入),但实际上,我不知道防止数据表注入的最佳方法,就像sql paramater一样。
当我在ColVal ....中发送单引号附加字符串作为参数时,上面的方法抛出异常。
答案 0 :(得分:1)
在那个实例中你不需要保护 - DataTable.Select()
将过滤器应用于该DataTable中保存在内存中的DataRows ,它实际上并没有连接到/执行任何操作数据库中。
<强>更新强>
如何创建此方法以将单引号
的任何单个实例加倍private string MethodName(string str)
{
return str.Replace("'", "''");
}
这样使用,
dataView.RowFilter = colName + " " + @operator + " '%" + MethodName(colValue) + "%'";
答案 1 :(得分:1)
如果您在使用Sql参数(最好的方法)查询数据库时已经防止了注入攻击,则没有理由在内存对象中应用注入防护登录。