2013-04-30 71 views
1

我有數據庫功能,它選擇不同的條件數據。有兩種可能的方法來實現這一點。 首先哪個更好的方法來停止sql注入

public string select(string name) 
    { 
     string s = null; 
     query = "select * from tablename where [email protected]"; 
     con.Open(); 
     com=new SqlCeCommand(query,con); 
     com.Parameters.AddWithValue("@name",name); 
     sdr=com.ExecuteReader(); 
     while (sdr.Read()) 
     { 
      s = sdr.GetString(0); 
     } 
     return s; 
    } 

在這種方法中,我需要在查詢,如訂單的地名或在查詢多個參數變化小的,地址,前20名等代碼的不同功能,但這種方法固定在sql注入方面。 二

public string select(string query) 
    { 
     string s = null; 
     con.Open(); 
     com=new SqlCeCommand(query,con); 
     sdr=com.ExecuteReader(); 
     while (sdr.Read()) 
     { 
      s = sdr.GetString(0); 
     } 
     return s; 
    } 

在第二種方法我通過數據庫查詢與值函數的參數,所以我不需要com.Parameters.AddWithValue("@name",name);,並不需要爲選擇查詢的變化代碼的不同功能。查詢中的參數值由代碼而不是由用戶給出。由於用戶未給出參數輸入,因此可以使用此方法進行sql注入。

哪一個是安全的,高效的,因爲我的應用程序無法承受數據丟失。

+1

我結合之前,我曾經通過數據持久層驗證長。在我達到這一點之前,我會拒絕它。 – duffymo 2013-04-30 12:41:49

+0

Imho第一種方法更好 €:duffymo是正確的,檢查你的輸入。 – jAC 2013-04-30 12:41:53

回答

1

您是否考慮過使用Linq進行SQL或EDM?使用這些對象意味着你的代碼(理論上)是免於SQL注入攻擊的。

+0

對於我來說,在.NET社區的某些部分有多少恐懼/混淆了LINQ和實體框架(以及其他ORM)。 – jfrankcarr 2013-04-30 12:50:31

+0

不知道我明白你來自哪裏。我的理解是查詢被轉換爲參數化查詢「底層」,但是您可以利用LINQ的易用性。這就是爲什麼我們無論如何使用它:) – Andrew 2013-04-30 12:52:53

+0

我認爲這是一個很好的建議,因爲使用它有助於消除不使用參數化查詢的快捷方式的誘惑。我見過很多遺留.NET代碼,它們將參數化存儲的proc調用與直接從用戶輸入構建SQL語句的「SQL構建器」代碼混合在一起。如果有人忘記檢查用戶在程序中的其他位置輸入,則會出現問題。 – jfrankcarr 2013-04-30 13:18:20

1

由於用戶沒有給出參數輸入 ,所以在此方法中是否可以執行sql注入。

只要你的用戶沒有與數據庫進行交互,誰會嘗試在你的參數中注入SQL。

一般來說,只要您在查詢中使用參數,您就可以安全使用SQL注入。

+0

是否有可能在某種程度上修改exe文件並訪問sql注入的第二種方法。我知道它的愚蠢問題的類型,但我不能承受數據丟失。 – 2013-04-30 12:55:55

+1

如果有人可以訪問您的EXE並可以做這樣的事情,那麼忘記SQL注入,您應該擔心其他事情。但話雖如此,你的第一種方法比另一種更好。 – Habib 2013-04-30 13:02:48

3

主要防禦:

選項#1:使用準備的語句(參數化查詢)

選項#2:使用存儲過程

選項#3:逸出所有用戶提供的輸入

額外防禦:

另外強制:最低特權

還執行:白名單輸入驗證

來源www.owasp.org

+0

哪一個比較好從上面兩個方面來看。 – 2013-04-30 12:52:18

+0

在你的情況下,由系統創建的查詢更安全,如果你正在執行客戶端驗證,然後將查詢旁邊的參數傳遞給查詢將會OK ..但是,正如我所說的使用存儲過程是更好的方法 – 2013-04-30 13:00:20