Select

使用 SELECT 安全地搜尋數據庫

  • April 15, 2016

我有一個網站,允許使用者在數據庫中搜尋多個項目。但是我對 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 查詢中有多個連接等,更好的選擇是將其轉換為儲存過程。

引用自:https://dba.stackexchange.com/questions/93282