防止在 ADO.Net 数据表中注入的最佳方法?

Posted

技术标签:

【中文标题】防止在 ADO.Net 数据表中注入的最佳方法?【英文标题】:Best approach to prevent injection in ADO.Net Datatable? 【发布时间】: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 中的参数发送时,上述方法会引发异常......

【问题讨论】:

【参考方案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 的忠实粉丝,用于尽可能实现....但是在这里,在上面的方法中,当我传递单引号附加字符串时,它会抛出例外......

以上是关于防止在 ADO.Net 数据表中注入的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 CodeIgniter 中防止 SQL 注入的最佳方法是啥 [重复]

通过 ADO.Net 命令调用 Informix 存储过程的最佳/正确方法?

SSIS 将 ADO Net 源聚合到 SQL Server 数据库中

ADO.NET复习总结--参数化SQL语句

防止sql注入的方法都有哪些

使应用程序与多个 ado.net 提供商一起工作的最佳方法是啥?