0

最近,我正在通过以下方式通过 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 参数一样。

当我将单引号附加字符串作为 ColVal 中的参数发送时,上述方法会引发异常......

4

2 回答 2

1

在这种情况下,您不需要保护 -DataTable.Select()正在对该 DataTable中的内存中保存的 DataRows 应用过滤器,它实际上并没有连接到/对数据库执行任何操作。

更新

如何创建此方法以将单引号的任何单个实例加倍

private string MethodName(string str)
{
    return str.Replace("'", "''");
}

所以使用,

dataView.RowFilter = colName + " " + @operator + " '%" + MethodName(colValue) + "%'";
于 2012-12-23T11:16:25.973 回答
1

如果您在查询数据库时已经防止了注入攻击,使用 Sql 参数(最好的方法),没有理由在内存对象上应用注入防止登录。

于 2012-12-23T11:17:56.060 回答