【问题标题】:Best approach to prevent injection in ADO.Net Datatable?防止在 ADO.Net 数据表中注入的最佳方法?
【发布时间】:2012-12-10 05:37:36
【问题描述】:

最近,我正在通过 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 中的参数发送时,上述方法会引发异常......

【问题讨论】:

    标签: c# ado.net datatable dataset


    【解决方案1】:

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

    更新

    如何创建这个方法来加倍单引号

    的任何单个实例
    private string MethodName(string str)
    {
        return str.Replace("'", "''");
    }
    

    如此使用,

    dataView.RowFilter = colName + " " + @operator + " '%" + MethodName(colValue) + "%'";
    

    【讨论】:

    • 但是当我在 colValue 中传递单引号附加字符串时,它会抛出异常......所以,我以为我在某处缺少注入预防......
    • 呃,你能发布异常吗?
    • 当我在 ColVal 中传递 'Silver(附加单引号)作为参数并在运算符中传递时,它会抛出“语法错误:在 'silver' 运算符之后缺少操作数。”....
    • 查看我的更新答案。也许您可以使用该方法将单引号的任何单个实例加倍。
    • 嗯...我已经制定了一种方法来避免这种情况,但我不确定最佳方法:str= str.Replace("'","''"); str=str.Replace("--", ""); str=str.Replace("[", "[[]"); str= str.Replace("%", "[%]");
    【解决方案2】:

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

    【讨论】:

    • 是的,你是对的....我是 sql 参数 n 的忠实粉丝,用于尽可能实现....但是在这里,在上面的方法中,当我传递单引号附加字符串时,它会抛出例外......
    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多