2017-01-09 365 views
0

我將如何滿足靜態代碼分析工具(在這種情況下checkmarx),有以下方法沒有任何問題:Checkmarx:二階在C#中的SQL注入攻擊

public OdbcDataReader ExecuteQuery(string sql) 
{ 
    var cmd = new OdbcCommand(sql, connection); 
    return cmd.ExecuteReader(); 
} 

Checkmarx告訴我下面的:

方法ExecuteQuery從ExecuteReader元素中獲取數據庫數據。 然後,此元素的值將在代碼 中流動,而不會進行正確的清理或驗證,並且最終將在方法ExecuteQuery的數據庫查詢中使用 。 這可能會啓用二階SQL注入攻擊。

+0

有什麼樣的輸入環境衛生'sql'在達到ExecuteQuery方法之前完成了嗎?我推斷分析工具看到'sql'進入,然後在ExecuteReader觸發之前被傳遞給OdbcCommand對象的構造函數... –

+0

SQL在Web服務器端被硬編碼。它使用String.Format而不是參數 –

+1

不幸的是,就SQL注入(直串而不是參數化查詢)而言,這或多或少是不要做的。除非我誤解了這種情況,否則這種方法至少不能進行一些衛生檢查嗎? –

回答

0

這樣做滿足CheckMarx:

public OdbcDataReader ExecuteQuery(string sql) 
{ 
    var cmd = new OdbcCommand(sql.Replace("'", ""), connection); 
    return cmd.ExecuteReader(); 
} 

有趣的是,我掃描自身的方法,並且使用命令沒有滿足它:

public OdbcDataReader ExecuteQuery(string sql) 
    { 
     OdbcCommand cmd = connection.CreateCommand(); 
     cmd.CommandText = sql; 
     return cmd.ExecuteReader(); 
    } 
+0

請注意,您只是隱藏了問題,您的代碼仍然可能容易受到智能攻擊者的攻擊(這對工具來說很難讓您明確的結果具有高度的確定性,從其他查詢中查找結果,風險較低)。 – AviD

+0

另外,簡單地將sql從命令構造函數中分離出來並沒有什麼不同。你爲什麼期望它?相反,您應該使用存儲過程(而不是硬編碼SQL查詢字符串),並通過將'CommandType'設置爲'StoredProcedure'來創建命令。 – AviD