2010-05-05 79 views
4

我有一個有點可憐這裏的情況。我堅持使用商業服務器,這並沒有做很多的消毒/參數化。參數化查詢/沒有/使用查詢

我試圖建立我的查詢,以防止SQL注入,但像搜索/哪裏需要搜索對象的條款,要建立一些東西,而且也沒有參數的接口。

基本上,我不能參數,但是我希望能夠使用相同的發動機,如果能夠建立我的查詢文本。有沒有辦法做到這一點,除了編寫我自己的參數化引擎,這可能還不如參數化查詢?

更新:例

where子句已被建成一個SQL查詢語句的where子句主要有:

CatalogSearch search = /// Create Search object from commerce server 
search.WhereClause = string.Format("[cy_list_price] > {0} AND [Hide] is not NULL AND [DateOfIntroduction] BETWEEN '{1}' AND '{2}'", 12.99m, DateTime.Now.AddDays(-2), DateTime.Now); 

*上面的例子是你如何細化搜索,不過,我們做了一些測試,此字符串沒有被清除

這就是我的問題所在,因爲.Format中的任何輸入都可以是用戶輸入,而我可以很容易地從文本框清理輸入,所以我會錯過邊緣情況,這只是事物的本質。我沒有選擇在這裏使用參數化查詢,因爲商業服務器中有如何處理組可擴展字段(模式)的一些瘋狂向後邏輯&自由文本搜索詞是預編譯的地方。 這意味着我不能直接去SQL表

什麼我/愛/看到的是沿着線的東西:

SqlCommand cmd = new SqlCommand("[cy_list_price] > @MinPrice AND [DateOfIntroduction] BETWEEN @StartDate AND @EndDate"); 
cmd.Parameters.AddWithValue("@MinPrice", 12.99m); 
cmd.Parameters.AddWithValue("@StartDate", DateTime.Now.AddDays(-2)); 
cmd.Parameters.AddWithValue("@EndDate", DateTime.Now); 

CatalogSearch search = /// constructor 
search.WhereClause = cmd.ToSqlString(); 
+0

(這是一個好主意,強調你的情況下,爲什麼你不能使用參數;感謝) – 2010-05-05 15:54:04

+1

你能給我們帶來什麼/你是如何想用這個來完成的例子嗎? – 2010-05-05 15:59:04

回答

1

這聽起來像你必須去老同學並在構建查詢之前親自驗證數據。我不是一個.NET的傢伙,但在CGI世界我會淨化輸入的東西,如:

$foo =~ s/[^a-zA-Z0-9*%]//g 

這將挫敗任何SQL注入我能想到的,仍然允許使用通配符。唯一的問題是正則表達式很昂貴。