Select
使用 SELECT 安全地搜尋數據庫
我有一個網站,允許使用者在數據庫中搜尋多個項目。但是我對 SQL 不是很好,而且我讀過允許使用者輸入框然後使用“SELECT-statements”是不安全的。下面的程式碼:
搜尋按鈕將搜尋作為參數發送:
protected void search_click (object sender, EventArgs e) { Response.Redirect("Search.aspx?Result=" + TextBoxSearch.Text); }
onLoad 在我的搜尋頁面中,它獲取值並呼叫 getData():
search = Request.QueryString["Result"].ToString(); getData();
getData() 方法:
protected void getData() { using (SqlConnection con = new SqlConnection(strCon)) { using (SqlCommand cmd = con.CreateCommand()) { cmd.CommandText = "SELECT [categoryId], [category] FROM [Category] WHERE ([category]=@search)"; cmd.Parameters.AddWithValue("@search", search); con.Open(); using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader.Read()) { LabelCat.Text = reader.GetString(reader.GetOrdinal("category")); HiddenFieldID.Value = reader.GetInt32(reader.GetOrdinal("categoryId")).ToString(); } else { LabelCat.Text = "Add"; //When search is made but no cateogry found } } } con.Close(); } }
這安全嗎?我覺得它對 sql-injections 非常薄弱,但我又對此知之甚少。如果它不安全,請建議我可以做到這一點的安全方法。
我正在使用 ASP.NET 和 C# webforms 在 VS12 中建構我的應用程序。使用 SQL 管理工作室建構我的數據庫。
編輯:最終我將不得不使用連接語句在這裡搜尋幾個表,不知道這是否相關但我應該提到它。
您使用了參數化查詢,這是防止 SQL 注入的最低要求。
我建議您可以注意一些點作為 C# 程式碼中的驗證
我在您從中獲取的文本上看不到任何伺服器端驗證
TextBoxSearch.Text
,您可以檢查一些可能是 SQL 注入嘗試的字元集。您可以查看SQL 注入的輸入集,並確保在執行 sql 查詢之前輸入字元串中不存在這些字元。
其他建議是,如果您希望在 sql 查詢中有多個連接等,更好的選擇是將其轉換為儲存過程。