2012-07-29 41 views
0

我有以下功能:這是從SQL注入返回DataTable安全的方法嗎?

public DataTable GetRecordSet(String query, string[] parameters) 

它通常用於如下:

DataTable dt = GetRecordSet("select * from objects where ob_id = @obid and ac_id = @acid", new[] { objectId, accountId }); 

的GetRecordSet方法解析查詢參數,尋找前​​面帶@的話,並撰寫傳遞到合適的SqlParameter對象一個SqlCommand對象。在這種情況下,將創建兩個參數。

查詢參數將始終由我提供,參數數組可能具有來自用戶的數據。

我擔心,因爲我從一個字符串生成參數名稱,我可能以某種方式無意中規避了反SQL注入對策。這種方法是否安全?

更新: GetRecordSet得到一個選擇命令如下:

SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = GetSqlCommand(query, parameters); 

的GetSqlCommand方法:

private SqlCommand GetSqlCommand(string query, string[] parameters) 
{ 
    SqlCommand sq = new SqlCommand(query, myConnection); 

    // enum parameters 
    // get name of parameter from the query string and add it to the SqlCommand 
    SqlParameter p; 
    string[] paramNames = query.Split('@'); 
    string name; 

    int paramCounter = 0; 
    if (parameters != null) 
    { 
     foreach (string param in parameters) 
     { 
      paramCounter += 1; 
      if (param != "") 
      { 
       try 
       { 
        if (paramNames.Length > paramCounter) 
        { 
         name = paramNames[paramCounter].Split(' ')[0]; 

         p = new SqlParameter(name, param); 
         sq.Parameters.Add(p); 
        } 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Error: {0}", ex); 
       } 
      } 
     } 
    } 
    return sq; 
} 
+0

很難說沒有看到'GetRecordSet'。雖然它使用參數,但它應該是安全的。 – Oded 2012-07-29 18:25:56

+0

更新的問題與更多細節。 – 2012-07-29 18:41:36

回答

0

上面的代碼是安全的從SQL注入 - 有一種方法利用parameter names,但是這個代碼對於這個特定的問題是安全的。

當然,沒有辦法100%確定,但這是一樣好。

0

否。從外部世界傳遞參數的唯一方法是,是否已明確標識或正確引用 。將任意文本塊插入 查詢是不安全的。