none
c# code 與 SQL 一問 RRS feed

  • 問題

  • 我想用幾個textbox 來記下用戶輸入的 SQL search 條件
    但我無法控制用戶想輸入有幾個 雖然我給出的textbox 不到時個
    但如果要做要用戶輸入幾個就search 幾個 我只係用 if 來控制
    如下
    string sqlStr;
    if(txtLandLordID .Text !="")
                {
                   sqlStr = "SELECT " + selectitem + " FROM LandLord WHERE LandLordID = '" + txtLandLordID.Text + "'";
                }
                if (txtGender.Text=="m"||txtGender.Text=="F")
                {
                    sqlStr = "SELECT " + selectitem + " FROM LandLord WHERE Gender = '" +txtGender.Text+ "'";
                }
                if (txtFirstName.Text != "")
                {
                    sqlStr = "SELECT " + selectitem + " FROM LandLord WHERE FirstName = '" +txtFirstName.Text + "'";
                }
                if (txtYear.Text != "")
                {
                    sqlStr = "SELECT " + selectitem + " FROM LandLord WHERE YearOfBirthday = '" + txtYear.Text + "'";
                }
    這樣做十分蠢 (特別是 做到條件之間 用 and 或是or 的時候 )
    不知道有沒有方便些的方法??
    2008年4月22日 下午 01:45

解答

  • Hi kelvinhon,

     

    關於SQL Injection的原理說明及初步的防範, 您可以參考以下2篇文章:

     

    SQL Injection – 駭客的 SQL填空遊戲

     

    『資料隱碼』SQL Injection的源由與防範之道

     

    至於使用SP(Strored procedure) 為何能大幅降低(並不代表完全避免)被攻繫的機會,是由於您可以透過SP的參數資料型態及長度,來控制使用者可以輸入資料的範團。例如您範例提到的LandLordID,Gender,FirstName,YearOfBirthday..等。可能都是1個 char,smallint 或smalldatetime就可以完成,如此就可以預防使用者輸入不必要的或惡意的資料。

     

    事實上,考慮使用SP而不用參數化的SQL statement的另一個原因,是因為SP是會預先編譯的。效能上又比一般的TSQL來得好。

     

    希望以上的說明對您有幫助!

     

    林泰宏 Terry Lin 
    技術支援工程師 Support Engineer
    Developer Support Team
    Global Technical Support Center - Taiwan

    技術支援服務首頁: http://support.microsoft.com

    技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

     

     

    2008年4月24日 上午 01:08

所有回覆

  • 如果是組合搜尋的話,沒有更好的方法。

    但你目前的作法,會有 SQL Injection 的嚴重風險。

     

    2008年4月22日 下午 02:55
    版主
  •  

    Hi kelvinhon,

     

    您的問題描述看來是要找不同欄位,並沒有看到組合搜尋的狀況。不過無論有沒有組合搜尋,您都可以透過Stored Procedule 來避免掉 SQL injection的風險。

     

    林泰宏 Terry Lin 
    技術支援工程師 Support Engineer
    Developer Support Team
    Global Technical Support Center - Taiwan

    技術支援服務首頁: http://support.microsoft.com

    技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

    2008年4月23日 上午 09:47
  • 多謝個位回答
    請問 taihon64 前輩
    可以說說 怎樣用 Stored Procedule 來避免掉 SQL injection的風險嗎?
    2008年4月23日 下午 01:43
  • Hi kelvinhon,

     

    關於SQL Injection的原理說明及初步的防範, 您可以參考以下2篇文章:

     

    SQL Injection – 駭客的 SQL填空遊戲

     

    『資料隱碼』SQL Injection的源由與防範之道

     

    至於使用SP(Strored procedure) 為何能大幅降低(並不代表完全避免)被攻繫的機會,是由於您可以透過SP的參數資料型態及長度,來控制使用者可以輸入資料的範團。例如您範例提到的LandLordID,Gender,FirstName,YearOfBirthday..等。可能都是1個 char,smallint 或smalldatetime就可以完成,如此就可以預防使用者輸入不必要的或惡意的資料。

     

    事實上,考慮使用SP而不用參數化的SQL statement的另一個原因,是因為SP是會預先編譯的。效能上又比一般的TSQL來得好。

     

    希望以上的說明對您有幫助!

     

    林泰宏 Terry Lin 
    技術支援工程師 Support Engineer
    Developer Support Team
    Global Technical Support Center - Taiwan

    技術支援服務首頁: http://support.microsoft.com

    技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

     

     

    2008年4月24日 上午 01:08
  • 我的做法是,在資料庫建立SP.

    然後將所有參數傳到SP.

    在SP 裡判斷傳入參數是空字串或NULL

    然後依判斷結果去執行相對的SELECT WHERE 的 Statement

    2008年4月24日 上午 02:52
  • 多謝指教
    真的十分受用
    2008年4月24日 上午 03:24