2011-12-08 178 views
2

我使用VS2005 C#ASP.NET和SQL Server 2005防止SQL注入在SELECT語句

我有我的ASP頁面上搜索功能,我覺得我的選擇查詢很容易受到SQL注射。

這是我目前SELECT語句

string LoggedInUser = (User.Identity.Name); 

SqlDataSource1.SelectCommand = "SELECT * FROM [TABLE1] where [" + DropDownList1.Text + "] like '%" + searchTB.Text + "%' AND [empUser] LIKE '%"+LoggedInUser+"%'"; 
SqlDataSource1.DataBind(); 

*其中searchTB是我的搜索文本框; DropDownList1是我的搜索類別; LoggedInUser是登錄用戶的用戶名。


我已經實現了參數,而不是串聯在我INSERT語句之一:

string sql = string.Format("INSERT INTO [TABLE2] (Username) VALUES (@Username)"); 
     SqlCommand cmd = new SqlCommand(sql, conn); 
     cmd.Parameters.AddWithValue("Username", usernameTB.Text); 
conn.Open(); 
cmd.ExecuteNonQuery(); 
conn.Close(); 

我想改變我的選擇聲明像我INSERT聲明,改用參數。我可以知道我應該如何改變它?

謝謝

+0

我的答案有問題嗎?你需要更多的幫助嗎? – dknaack

回答

0

這是不可能的參數您的下拉列表和文本框爲ASP.NET不允許的控制參數。

2

編寫獲取數據SOURSE的方法和使用SQL參數查詢。 Here是一個很好的例子,如何在命令對象添加參數

SqlCommand command = new SqlCommand(commandText, connection); 
command.Parameters.Add("@ID", SqlDbType.Int); 
command.Parameters["@ID"].Value = customerID; 

讓我單獨從UI功能的數據庫訪問,我會用的方法進行查詢。此外,這允許重用查詢。

1

這不是一個簡單的任務來動態指定查詢字段名,所以我建議只是在做開關/案例驗證字段名稱,像這樣:

switch (DropDownList1.Text) 
{ 
    case "ValidField1": 
    case "ValidField2": 
    ... 
     break; 
    default: 
     throw new ArgumentException(...); // or prevent query execution with some other statement 
} 

SqlDataSource1.SelectCommand = "SELECT * FROM [TABLE1] where [" + DropDownList1.Text + "] like @value AND [empUser] LIKE @user"; 
SqlDataSource1.SelectParameters.Add("value", "%" + searchTB.Text + "%"); 
SqlDataSource1.SelectParameters.Add("user", "%"+LoggedInUser+"%"); 
SqlDataSource1.DataBind(); 
+0

我在我的案例「ValidFied1」中放了什麼。可以舉個例子嗎? Thks – gymcode

+0

@RUiHAO:來自DropDownList1或(這應該是相同的)來自TABLE1的所有字段名稱的所有值,允許用戶執行搜索。這是防止在DropDownList1.Text字段中發送任意內容(SQL注入)所必需的。 –

0
  1. 你可以簡單地使用過濾器表達式的SQL數據源SQL Datasource filter expression

  2. 您可以編寫帶有對象數據源自己的選擇功能的方法/數據表