2013-04-10 106 views
1

我有一個大表單,當我試圖執行SQL查詢以保存表單數據時,我得到一個SqlException(類似於每個查詢超過1200個SQL參數)。從SQL注入保護應用程序

由於性能問題,通過少於1200個SQL參數的查詢分解查詢並不是一個好主意,實際上這並不容易。我擔心在SQL查詢中放入原始值可能會導致SQL注入的安全問題。

那麼我該怎麼辦?如果我放入原始值,那麼保護應用程序免受SQL注入攻擊的最佳方式是什麼?

+5

唯一可靠的方法:***始終***使用**參數化查詢**,並且沒有例外。 – 2013-04-10 14:09:22

+1

有一個U + 02BC unicode引號標記可以避免SQL Server中的單引號(用兩個引號替換一個引號),但只有當字符串隱式轉換爲ascii時纔有效。還有其他針對MySQL等的攻擊,它們使用了多種方式來轉義字符串終結符,但在SQL Server中並非如此。 – criticalfix 2013-04-10 14:48:36

+0

marc_s是最重要的一點。你也應該驗證你的輸入:大多數信息(姓名,地址等等)不包含引號,破折號,撇號等,所以過濾掉並讓用戶知道 – 2013-04-10 15:33:05

回答

1

創建xml的參數值並將xml作爲單個參數傳遞。然後只需將xml解析爲任意數量的變量(或臨時表中的行)。例如,而不是:

SELECT ?, ?, ? 

並傳遞'my first form value''my second form value''my third form value',你可以這樣做:

DECLARE @x XML SET @x = ?; 
SELECT 
    T.x.value('@a1', 'NVARCHAR(50)') 
    , T.x.value('@a2', 'NVARCHAR(50)') 
    , T.x.value('@a3', 'NVARCHAR(50)') 
FROM @x.nodes('/form/data') AS T(x) 

,並通過只是一個XML參數,'<form><data a1="my first form value" a2="my second form value" a3="my third form value" /></form>'。 SQL Server 2005+具有非常高效的xml解析器,因此我可以想象這與直接傳遞參數一樣快。

當然,您必須採取措施來生成注入彈性xml,但如果我不得不將這麼多的查詢傳遞給我,我會這樣做。 (這就是說,我很難想象一種情況,在這種情況下,人們可能會合法地需要很多平坦的參數。接受任意數據而不是顯式參數會對我更有意義,在這種情況下,上述xml可能會更像是'<form><data name="a1" value="my first form value" /><data name="a2" ... </form>',但同樣的解決方案仍然有效。)