2013-07-24 93 views
2

我有以下代碼建立在C#(SQL注入攻擊)動態查詢

public DataSet GetProject(string projectID) 
{ 
    DataSet dataTable = new DataSet(); 
    DataAccess dataAccess = new DataAccess(); 
    OracleCommand commandOb = new OracleCommand(); 
    strQuery.Append("select projectName, managerName"); 
    strQuery.Append("from project "); 
    strQuery.Append("where projectID = '" + projectID + "'"); 

    cmd.CommandText = strQuery.ToString(); 
    dataTable = dataAccess.ExecuteDataAdapter(commandOb); 

    return dataTable; 
} 

這是建立查詢並執行它的一個好方法是什麼?這會對SQL注入攻擊產生危害嗎?

是否有建議的方法來動態構建查詢。任何幫助,將不勝感激。

+1

從動態'走就走querys'嘗試使用參數然後使用'string.Format(從ProjectID = {0}的項目中選擇projectName,managerName「,projectID);' – MethodMan

+4

使用參數化查詢或更好的方式,調用a存儲過程... – user2480596

+0

'+ 1' StoredProcedure不能出錯那 – MethodMan

回答

3

以這種方式構建查詢確實會使其容易受到SQL注入攻擊,除非您已手動轉義輸入(IE使'projectID'的值不可能通過使用數據庫引擎特定的轉義序列來更改查詢結構)。但是,推薦的方法是使用參數化查詢(有時稱爲「準備語句」)。通過參數化查詢,您只需定義查詢結構,然後分別提供輸入值作爲參數,從而防止通過SQL注入來更改查詢的結構。

這裏就是你們的榜樣,改爲使用參數:

public DataSet GetProject(string projectID) 
{ 
    DataSet dataTable = new DataSet(); 
    DataAccess dataAccess = new DataAccess(); 
    OracleCommand commandOb = new OracleCommand(); 
    strQuery = @"select projectName, managerName 
        from project 
        where projectID = :ProjectID" 

    cmd.CommandText = strQuery; 
    cmd.Parameters.AddWithValue("ProjectID", projectID); 
    dataTable = dataAccess.ExecuteDataAdapter(commandOb); 

    return dataTable; 
} 

參數:在查詢「專案編號」將與「AddWithValue」的方法給定的值來代替。無論「projectID」變量中的值是什麼,它都將作爲WHERE子句的一部分進行評估。而之前,與['; DELETE FROM項目; - ]可能有不良改變您的查詢內容如下影響:

select projectName, managerName 
    from project 
    where projectID = ''; DELETE FROM project;--' 
0

是的,查詢很容易受到sql注射。如果projectID通過其他查詢在您的應用程序中進行內部檢索,則由於沒有直接的用戶輸入而不易受到攻擊。

但是,如果某些用戶輸入爲:"=1' OR 'a'=a'",則將檢索所有項目,以允許在未經適當授權的情況下訪問數據。更糟的是,可以執行意外的命令,例如刪除所有記錄。

儘管如此,最好的做法是使用參數化查詢或綁定參數以獲得更好的性能和針對注入的安全性。參數化查詢轉義保留字符,但您仍然必須手寫出所有查詢。其他選擇包括使用ORM等等。 http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-1.html

using (var cn = new OracleConnection(connString)) 
{ 
    var sql = "select projectName, managerName from project where projectID = :p1"; 
    using (var cmd = new OracleCommand(sql, cn)) 
    { 
    cmd.BindByName = true; 
    cmd.Parameters.Add(new OracleParameter(":p1", OracleDbType.Varchar2, projectID, 
              ParameterDirection.Input)); 
    using (var adapter = new OracleDataAdapter(cmd)) 
    { 
     cn.Open(); 
     var dataSet = new DataSet(); 
     adapter.Fill(dataSet); 
     return dataSet; 
    } 
    } 
} 

注:

更多的信息和sql注射有用.net特定的博客系列,更見https://www.owasp.org/這是odp.net