2012-12-23 23 views
0

最近,我在數據表通過數據視圖以下列方式做過濾:在ADO.Net Datatable中防止注入的最佳方法?

 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中,它實際上並沒有連接到/正在對數據庫執行任何操作。

UPDATE

如何創建此方法將翻一番單引號中的任何單個實例

private string MethodName(string str) 
{ 
    return str.Replace("'", "''"); 
} 

這樣使用起來,

dataView.RowFilter = colName + " " + @operator + " '%" + MethodName(colValue) + "%'"; 
+0

但是,當我通過單引號附加字符串colValue,它會拋出異常......所以,我以爲我錯過了注射預防的地方... –

+0

嗯,你能發佈異常嗎? –

+0

當我將'Silver(單引號追加)作爲參數傳遞給ColVal和Like運算符時,它會拋出「Syntax error:Missing operand after'silver'operator。」.... –

1

如果您已經阻止注入在查詢數據庫時使用Sql參數(最好的方法)進行攻擊,t這裏沒有理由在內存對象中應用注入預防登錄。

+0

是啊,你是對的....我是SQL參數n用於實現儘可能的大扇子....但在這裏,在上面的方法,當我通過單引號附加字符串,它會拋出異常.... –