2008-09-30 42 views
3

我們正在嘗試更新我們的經典asp搜索引擎,以防止SQL注入。我們有一個VB 6函數,它通過基於各種搜索參數連接查詢來動態構建查詢。我們已經將這個轉換爲一個存儲過程,對於除關鍵字以外的所有參數都使用動態sql。動態SQL - 搜索查詢 - 變量關鍵字數

關鍵字的問題在於,用戶提供了可變數字詞,我們希望爲每個關鍵字搜索多個列。由於我們無法爲每個關鍵字創建單獨的參數,因此我們如何才能構建安全的查詢?

例子:

@CustomerId AS INT 
@Keywords AS NVARCHAR(MAX) 

@sql = 'SELECT event_name FROM calendar WHERE customer_id = @CustomerId ' 

--(loop through each keyword passed in and concatenate) 

@sql = @sql + 'AND (event_name LIKE ''%' + @Keywords + '%'' OR event_details LIKE ''%' + @Keywords + '%'')' 

EXEC sp_executesql @sql N'@CustomerId INT, @CustomerId = @CustomerId 

什麼是從SQL注入對此進行處理並維持保護的最佳方式?

回答

3

您可能不喜歡聽到這個消息,但在發佈數據庫之前,回到代碼中動態構建SQL查詢可能會更好。如果在SQL字符串中使用參數佔位符,則可以抵禦SQL注入攻擊。

例子:

string sql = "SELECT Name, Title FROM Staff WHERE [email protected]"; 
using (SqlCommand cmd = new SqlCommand(sql)) 
{ 
    cmd.Parameters.Add("@UserId", SqlType.VarChar).Value = "smithj"; 

你可以建立根據設定需要查詢,然後一旦串完成添加參數值的列的SQL字符串。這有點痛苦,但我認爲這比真正複雜的TSQL容易得多,因爲它可能會導致很多可能的輸入變量。

+0

+1這種做法將避免逃避問題完全 – 2008-09-30 22:36:10

1

您有3個選項。

  1. 使用function that converts lists tables並加入到它中。所以你會有這樣的事情。

    SELECT * 
    FROM calendar c 
        JOIN dbo.fnListToTable(@Keywords) k 
         ON c.keyword = k.keyword 
    
  2. 有一個固定的則params的,只允許被搜索的

    CREATE PROC spTest 
    @Keyword1 varchar(100), 
    @Keyword2 varchar(100), 
    .... 
    
  3. 的最多N個關鍵詞寫在TSQL的轉義字符串函數和逃避你的關鍵字。

0
  • 除非你需要它,你可以簡單地去掉,這不是在[A-ZA-Z]任意字符 - 大多數的這些事情不會在搜索和你不應該能夠注入這種方式,也不必擔心關鍵字或類似的東西。但是,如果你允許引號,你需要更加小心。

  • 到sambo99的#1類似,您可以插入關鍵字到一個臨時表或表變量和沒有注射的危險,加入到它(即使使用通配符):

這是不是真的動態:

SELECT DISTINCT event_name 
FROM calendar 
INNER JOIN #keywords 
    ON event_name LIKE '%' + #keywords.keyword + '%' 
    OR event_description LIKE '%' + #keywords.keyword + '%' 
  • 實際上,你可以生成大量的參數的SP,而不是通過手工編碼它的(設置默認爲「」 NULL或根據你的喜好編碼你的搜索)。如果你發現你需要更多的參數,增加它生成的參數的數量會很簡單。

  • 您可以將搜索移動到數據庫之外的全文索引(如Lucene),然後使用Lucene結果來拉取匹配的數據庫行。

0

你可以試試這個:

SELECT * FROM [tablename] WHERE LIKE % +keyword%