2015-01-13 61 views
2

我最近開始在一個公開的SQL注入攻擊公司工作。因爲他們幾乎沒有任何衛生設施。Sql注入 - 下面是否有攻擊?

指出問題後,我負責修復它。

通常這會很容易,用SQLParamater對象替換裸露變量。 但是我發現了一些稍微奇怪的代碼使用,讓我想知道。

看來我的前任一直在使用存儲過程和駐留在代碼中的一些SQL。然而在一個地方,他似乎將兩者結合起來。

他正在使用一些裸變量動態構建SQL,然後將此生成的SQL作爲參數傳遞給存儲過程。

我想知道這個的安全性,會傳遞實際的SQL作爲參數來清理它,否則我將不得不重新設計存儲過程?

以下是他在做什麼(大大簡化)的代碼片段:

DataSet ExecuteQuery(string unsanitizedInput) 
{ 
    string dynamicSQL = "WHERE column = " + unsanitizedInput; 
    MySqlParameter param = new MySqlParameter("param1", dynamicSQL); 
    string procname = "StoredProc_Name"; 
    DataSet ds = new DataSet(); 

    using (MySql.Data.MySqlClient.MySqlDataAdapter adapter = new MySql.Data.MySqlClient.MySqlDataAdapter(procname, DataUtils.ConnectionStrings["string"])) 
    { 
     adapter.SelectCommand.CommandType = CommandType.StoredProcedure; 
     adapter.SelectCommand.Parameters.Add(param); 
     adapter.Fill(ds); 
    } 
    return(ds); 
} 

顯然,實際的查詢要複雜得多了許多參數。但是這應該讓你知道他在做什麼的原則。

我的問題是這樣的:上述安全嗎? 即使在要注入存儲過程的更大的SQL語句的一部分時,未處理的輸入是否會被清除?

我知道上述是可怕的做法,並使得幾乎不可能找出SQL查詢,但這是我現在的位置。

所有的建議appriciated,並提前感謝。

+0

:取決於輸入即,如果輸入是(1或1 = 1),然後是它是開放的攻擊。 Where子句將被繞過。 –

+0

我認爲最好的方法是使用參數化查詢。並且在進程之前驗證輸入作爲查詢。如果我們能夠找到sql注入語句的某些類型,那麼就避免這種輸入。 –

+0

你沒有顯示存儲過程,但我會假設如果動態SQL被傳遞給它,然後proc建立一個查詢與代碼然後執行它(例如[EXECUTE命令](http://msdn.microsoft .com/en-GB/library/ms188332.aspx)在T-SQL中)。在這種情況下,它仍然會受到SQL注入攻擊。 –

回答

-1

帶參數的查詢不提供對slq注入攻擊的全面保護,既不存儲過程。我用了兩個,但2010年通過網站的db被嚴重損害了two-step sql injection

MSDN強烈建議檢查任何輸入文本的可疑元素。查看更多How To: Protect From SQL Injection in ASP.NET

我用下面的簡單的代碼來檢測SQL注入(使用一些良好來源我已經不記得構造):

public static bool DetectSqlInjection(string Text) 
{ 
    string CleanText = Text.ToUpper().Replace("/**/", " ").Replace("+", " ").Replace(" ", " "); 

    string[] InjectionPatterns = { 
            "VARCHAR", 
            "EXEC", 
            "DECLARE", 
            "SELECT *", 
            "SELECT PASSWORD", 
            "SELECT USERNAME", 
            "$_GET", 
            "NULL OR", 
            "UNION ALL SELECT", 
            "WAITFOR DELAY", 
            "SELECT pg_sleep", 
            "SHOW TABLES FROM" 
            }; 

    foreach (string Pattern in InjectionPatterns) 
    { 
     if (CleanText.Contains(Pattern)) 
      return true; 
    } 

    return false; 
} 
+0

您正在爲2005年5月推薦的.NET 2.0指南?今天的建議是使用準備好的語句提供的參數化。 – Gumbo

+0

事情變化越多,他們就越是保持不變。關於sql注入攻擊,自2005年以來唯一的變化是它們的攻擊變得更加全面和難以識別。直到2010年,我也相信參數化,當時我明白參數化並不是萬能的,儘管這是一個非常不愉快的經歷。 –