如何在DataTable列中搜索用户输入

时间:2010-12-27 04:54:15

标签: c# sql datatable sql-injection datatable.select

目前我正在搜索如下。

  

DataRow [] rows =   dataTable.Select( “字段名='” +   userInput +“'”);

这里的问题是,只要用户提供带有单引号(')的输入,就会抛出错误。

我可以通过

轻松纠正它
  

DataRow [] rows =   dataTable.Select(“FieldName ='”+   userInput.Replace(“'”,“''”)+“'”);

我担心其他用户输入可能会导致什么问题?

3 个答案:

答案 0 :(得分:2)

Here是尊敬的Mr. Jon Skeet的确切答案。

答案 1 :(得分:1)

@Ismail:如果我们在前端查询或后端查询中使用之前验证用户输入,那将是一个好习惯。

所以我认为在你的场景中你必须具有像...这样的功能。

if(ValidateInput(userInput))
{
  DataRow[] rows = dataTable.Select("FieldName='"+ userInput + "'");
}

在验证中你可以做任何检查。现在你只想检查'但将来,你可能需要检查其他东西。

根据你的需要你可以修改返回类型的验证函数,如果你想修改输入数据然后修改并返回其他只返回bool。

如果你想使用DataTable.Select(filter)进行数据过滤,那么你必须格式化/忽略或替换filter语句中的特殊字符,为此你必须编写更多的代码。如果您不想对特殊角色感到恐慌,那么您可以使用LINQ,如

        DataTable dataTable = new DataTable();
        DataColumn dc = new DataColumn("FieldName");
        dataTable.Columns.Add(dc);
        DataRow dr = dataTable.NewRow();
        dr[0] = "D'sulja";
        dataTable.Rows.Add(dr);
        string input = "D'sulja";

        var result = from item in dataTable.AsEnumerable()
                     where item.Field<string>("FieldName") == input select item;

答案 2 :(得分:0)

在这种情况下,我认为单引号是您唯一需要担心的字符,因为它用于分隔字符串值。有关表达式语法的详细信息,请参阅DataColumn.Expression的MSDN条目(创建过滤器表达式使用与DataColumn.Expression属性相同的规则)。

您没有指出您正在使用哪个版本的C#,但是使用LINQ,您可以执行此操作:

var rows = table.AsEnumerable()
                .Where(r => r.Field<string>("Name") == "O'Hare")
                .Select(r => r)
                .ToArray();

一个权衡是,如果DataTable中有任何已删除的行,您还需要检查RowState,但它确实提供了另一个选项。