2009-12-06 60 views
1

我需要構建要與WHERE子句一起使用的搜索條件。然後將此搜索條件傳遞給不同的應用程序,以作爲SQL查詢的一部分執行。因爲搜索條件可能非常複雜(包括子查詢),我不相信接收應用程序可以智能地解析它們以防止SQL注入攻擊。爲SQL WHERE子句構建安全搜索條件

最佳做法聲明應使用參數化查詢。當你使用命令對象自己執行查詢時,這很好。在我的情況下,我希望獲得該查詢字符串與參數合併到它,並解析出我感興趣的搜索子句。有沒有辦法做到這一點?

我與MS SQL Server一起工作,目前只需用來自調用者的字符串中的兩個單引號替換所有單引號。有沒有更好的方法來實現SQL注入攻擊的一定程度的保護?

+0

不同什麼? – SLaks 2009-12-06 15:19:08

+1

如果您獲得的字符串已將參數合併到其中,那麼如何「用兩個單引號替換所有單引號」?難道這不會像'WHERE name ='KOTMATPOCKUH'這樣的東西? – Heinzi 2009-12-06 15:35:47

+0

@Heinzi我要建立WHERE,所以我給了搜索值KOTMATPOCKUH。但它也可能包含惡意代碼。使用參數會很理想,但是看起來我不能讓.NET爲我完成這項工作,並將查詢返回給我。 – LeffeBrune 2009-12-06 15:41:57

回答

2
+0

內容豐富的閱讀,但不幸的是我指出,從用戶輸入中取代/剝離非法字符的方向,因爲參數化在我的情況下是不可能的。 – LeffeBrune 2009-12-06 15:56:09

+0

如果我誤解了,我很抱歉,但我認爲那是你的意圖? – 2009-12-06 15:58:39

+1

我一直在尋找一種比「替換報價」更​​好的防止注入攻擊的方式。或者證明替換引號就足夠了。你的回覆中第二個線索的答案之一似乎表明處理引號應該足夠好。然而,我會對我的輸入字符串應用嚴格的規則,因爲我會知道有效字符串可能包含的值。 謝謝! – LeffeBrune 2009-12-06 17:33:01

1

認爲你的罰款:根據SQL Server Books Online ,一個solita ry單引號似乎是退出一個以單引號開頭的引用字符串的唯一方式。因此,用''代替'應該足以避免通過string變量進行SQL注入。

我想不出任何辦法通過其他,非字符串本地的C#數據類型的SQL注入,如果他們是正確(區域設置不變)轉換爲字符串。

儘管如此,參數化查詢是「推薦」的解決方案。目前,您的應用程序似乎是這樣組織的:

  1. A部分基於用戶輸入創建WHERE語句。
  2. 將包含此WHERE語句的字符串傳遞給B部分。
  3. B部分添加SELECT等並將其發送到SQL Server。

這是一個選項來重寫你的應用程序嗎?

  1. A部分根據用戶輸入創建一個參數化的WHERE語句和一組參數。
  2. 將包含WHERE語句以及包含參數的Hashtable(或類似內容)的字符串傳遞給B部分。
  3. B部分創建命令,添加SELECT等,添加參數並將其發送到SQL Server。

我處於類似的情況,並通過創建一個SubSQL類來解決它,該類基本上包含帶有CommandText的參數化字符串和帶參數的哈希表。然後你可以使用這個作爲mySubSQL.CommandText += ...,mySubSQL.Parameters("@myfield") = myValuemySubSQL.MergeInto(myCommand)(實現應該是明顯而直接的)。

+0

不幸的是,重寫應用程序以使用參數化查詢不是一種選擇。我的.Net應用程序必須將查詢提供給SugarCRM的SOAP API(用PHP編寫)。 迄今爲止我能做的最好的事情就是對傳遞到我的代碼的內容進行嚴格的限制。例如,如果我使用SOAP API通過電子郵件地址查找用戶,我必須確保調用者傳遞給我的字符串實際上是一個電子郵件地址,如果我正在查找產品SKU,請確保它是字母數字等。感謝您的幫助雖然! – LeffeBrune 2009-12-06 17:16:19