2012-08-16 28 views
1

想我查詢一個SQL Server DB爲行基於其價值通過Windows格式的文本輸入提供一列LIKE的比較計數。由於可能的用戶輸入導致注入,因此在這裏使用參數很重要。最後,我對一個實例化對象SqlCommand我命名爲cmd上執行的成員函數ExecuteScalar(),但我第一次添加的參數。例如:處理的參數值的特殊字符的LIKE比較

cmd.Parameters.AddWithValue("@param1", textBox1.Text); 

SQL Server使用作爲通配符匹配的LIKE比較特殊字符%。我想要做的是允許用戶使用*來代替通配符。因此,一個簡單的替換:

textBox1.Text.Replace('*','%'); 

的問題是我遇到的問題與含特殊符號%_值。搜索文字%而不是將其用作通配符的一種方法是將其括在方括號中:[%]

所以,現在我的更換有可能成爲:

textBox1.Text.Replace("%","[%]").Replace("_","[_]").Replace('*','%'); 

順序是這裏同樣重要,因爲如果最後的Replace作了越早%會被錯誤地處理。

我不知道我已經介紹了我的所有基地,是否有其他字符,我需要約在這裏擔心呢?這真的能防止注射嗎?是否還有其他一些首選的方式?

一個例子查詢可能是這樣的:

SELECT COUNT(*) FROM [MyTable] WHERE [Column1] = @param1 

哪裏MyTable是你的表名和Column1是內MyTable有效的列名。我們可以假設Column1是一些nvarchar類型。

+0

你能告訴哪裏該參數將要使用的SQL語句? – 2012-08-16 14:16:10

+0

@AaronBertrand最後把它放在了一邊,它會是超級基礎。 – user17753 2012-08-16 14:18:57

+0

正確,但是這是在C#中構建的SQL語句還是您將參數傳遞給存儲過程? – 2012-08-16 14:19:26

回答

1

你應該不是真的有什麼事,但我會確保從用戶輸入測試古怪的事情。你還沒有佔到某些字符具有特殊的含義LIKE

^ 
- 

既然你傳遞參數到語句,而不是一味地將字符串,有應該是注射的危險很小,但你可能想嘗試的用戶輸入的變化,例如:

foo'; DELETE dbo.[UnimportantTable]; 
foo''; DELETE dbo.[UnimportantTable]; 
foo''''; DELETE dbo.[UnimportantTable]; 

同樣,我不知道,如果你是脆弱的,因爲我不能看到整個事情,但我認爲它很容易構建各種各樣的測試,讓你知道所有潛在的結果與廣泛的潛力取樣tial輸入。

由於@Bryan指出,無疑是一個很好的方式來控制風險是使用具有隻在您希望他們能夠閱讀的對象非常明確的只讀權限的登錄連接。然後,即使他們在你的腳手架上利用了一些洞,進入也不會買太多。