我最近開始在一個公開的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,並提前感謝。
:取決於輸入即,如果輸入是(1或1 = 1),然後是它是開放的攻擊。 Where子句將被繞過。 –
我認爲最好的方法是使用參數化查詢。並且在進程之前驗證輸入作爲查詢。如果我們能夠找到sql注入語句的某些類型,那麼就避免這種輸入。 –
你沒有顯示存儲過程,但我會假設如果動態SQL被傳遞給它,然後proc建立一個查詢與代碼然後執行它(例如[EXECUTE命令](http://msdn.microsoft .com/en-GB/library/ms188332.aspx)在T-SQL中)。在這種情況下,它仍然會受到SQL注入攻擊。 –