防止在 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 存储过程的最佳/正确方法?