3

そこで、DataView RowFilter プロパティを使用して、AppRelativeCurrentExecutionFilePath に基づいてキャッシュされた DataTable をフィルター処理するハンドラーを作成しています。インジェクション攻撃を防ぐために入力をエンコードする最良の方法は何ですか?

以下で十分ですか?より良い/よりエレガントな方法はありますか?

dataView.RowFilter = String.Format("Name LIKE '{0}%'", EncodeString(query));

private string EncodeString(string s)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.Length; i++)
    {
        char c = s[i];
        if (c == '*' || c == '%' || c == '[' || c == ']')
            sb.Append("[").Append(c).Append("]");
        else if (c == '\'')
            sb.Append("''");
        else
            sb.Append(c);
    }

    return sb.ToString();
}
4

1 に答える 1

0

RowFilter に sql を注入することはできません。

編集: 指摘したように、インジェクションによってテーブル内のすべての行を取得することが可能であり、次のような作業が可能です:

dataTable.AsEnumerable()
    .Where(r => r.Field<string>("StringColumn").Contains(userInput))
    .ToList().ForEach(r => Console.WriteLine(r.Field<string>("StringColumn")));
于 2009-08-12T14:16:02.907 に答える