2009-08-12 10 views
3

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

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

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(); 
} 
+0

私は...あなたがここにSQLを注入することができるとは思わない。指摘したように、次のような作業のようなものができ、注射によって、テーブル内のすべての行を取得することが可能です例外が発生します。しかし、はい、それは私がやることとほぼ同じです。 – dotjoe

+0

メモリ内のデータを使用している場合は、コレクションだけでなく、なぜDataTableを使用するのですか?あなたは 'どこで'を使ってそれをフィルターに掛けることができ、注射については気にしません。 –

+0

@SergRogovtsev - 私は2009年に質問したので、おそらく.NET 1.1アプリでした。企業のアップグレードは遅いです。 – MyItchyChin

答えて

0

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

編集:

dataTable.AsEnumerable() 
    .Where(r => r.Field<string>("StringColumn").Contains(userInput)) 
    .ToList().ForEach(r => Console.WriteLine(r.Field<string>("StringColumn"))); 
+0

RowFilterはSQL Where句に非常によく似た文字列であり、ユーザ入力からフィルタ文字列を作成する場合は、注入によって悪用されます。私の例では、URLに基​​づいてDataTableをフィルタリングしています(例:http:// site/handler/stringUsedInFilter)。フィルタはLIKE比較です。したがって、 "handler /"の後ろの何かが "%25% 25%25%25%25 "はテーブルの内容全体を返すために最小長さと空文字列チェックをバイパスします。 "'"を指定すると、フィルタが無効になり、例外がスローされます。 ... – MyItchyChin

+0

はい、あなたはガードする必要がある完全なテーブルを返さないようにします。テーブル全体が返されるか、あなたが守ることができるものがありますか? –

+0

@Yuriy:実際にフィルタリングする入力が%%%%%の場合はどうでしょうか?それは彼らをあまり良くしません。入力がO'Brienの場合はどうなりますか?これにより、SyntaxErrorExceptionがスローされます。入力をフィルタリングする必要があります。 – MyItchyChin

関連する問題