2009-08-12 85 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 2009-08-12 14:12:34

+0

如果您使用的是內存數據,爲什麼使用'DataTable'而不僅僅是任何集合?你可以用'Where'來過濾它,而不需要打針。 – 2012-08-16 20:10:30

+0

@SergRogovtsev - 我在09年問過這個問題,所以它可能是一個.NET 1.1應用程序。企業升級緩慢。 – MyItchyChin 2012-08-20 17:32:31

回答

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 2009-08-12 14:50:50

+0

是的,爲了不返回你必須警惕的整張桌子。是否曾經有過整個桌子被退回的情況,或者是您可以防範的事情? – 2009-08-12 15:06:57

+0

@Yuriy:如果他們想要過濾的輸入真的是%%%%%?這不會對他們有好處。如果輸入是O'Brien呢?這會導致拋出SyntaxErrorException。輸入需要過濾。 – MyItchyChin 2009-08-12 16:06:15