2011-01-12 40 views
5

例如,這是我使用的代碼:使用帶參數的動態SQL是否安全?如果不是,可能會遇到哪些安全問題?

String commandString = "UPDATE Members SET UserName = @newName , AdminLevel = @userLevel WHERE UserID = @userid"; 
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnectionstring"].ConnectionString)) 
{ 
    SqlCommand cmd = new SqlCommand(commandString, conn); 
    cmd.Parameters.Add("@newName", newName); 
    cmd.Parameters.Add("@userLevel", userLevel); 
    cmd.Parameters.Add("@userid", userid); 
    conn.Open(); 
    cmd.ExecuteReader(); 
    Reader.Close(); 
} 
+1

這是首選的,安全的方式來做到這一點(Baring一些微妙的錯誤,我失蹤) – Greg

+0

真棒迴應傢伙!欣賞它! – RoundOutTooSoon

回答

7

該代碼看起來不錯。參數化是要走的路,而不是在adhoc SQL語句中連接用戶提供的值,這可能會導致SQL注入攻擊。這也可以幫助執行計劃重用。

我唯一想補充的是,我更喜歡明確定義參數的數據類型和大小。例如,如果您不這樣做,那麼作爲示例,所有字符串值將作爲NVARCHAR而不是VARCHAR傳遞到數據庫。因此我喜歡明確。

4

,因爲它的參數這是對SQL注入安全。其他安全問題,例如確保@userid不被欺騙,是應該在應用程序的其他層處理的單獨的安全問題。

2

這仍然是一個靜態查詢字符串。它不是真正的「動態」 SQL,直到你也建部分字符串在飛行—是這樣的:

var sql = "SELECT columns FROM Table WHERE 1=1"; 
if (!string.IsNullOrEmpty(txtName.Text)) sql += " AND Name LIKE '%' + @Name + '%'"; 
if (!string.IsNullOrEmpty(txtDesc.Text)) sql += " AND CONTAINS(DESCRIPTION, @description)"; 

但即便如此,這個只要你繼續仍處於SQL注入意義上的「安全」爲查詢的每個源自用戶輸入的部分使用參數。

相關問題