2017-06-16 93 views
3

我正在製作SSRS報告,其存儲過程如下所示。我的用戶需要一個搜索工具,它將在名稱字段中返回所有可能的結果,以便「AD」的名稱應返回「ADAM」和「MADELYN」。我容易受到SQL注入嗎?

我很擔心,因爲我使用字符串連接我的where子句,是有可能,這個存儲過程可以犧牲品SQL注入攻擊:

BEGIN 
    @location varchar(20),@name varchar(20) 
    SELECT location, name 
    FROM table 
    WHERE (location LIKE @location+'%') AND (name LIKE '%'[email protected]+'%') 
END 

這段代碼脆弱?而且,如果是這樣,我如何解決它是安全的?

+1

我沒有看到一個大問題。你的參數只有20個字符長,限制了很多問題。在where子句中使用它的方式進一步限制了問題,並且沒有輸入動態SQL,所以我認爲你從這個角度出發是很好的。 – Jesse

+0

您將始終需要清理應用程序級別上的輸入數據 – jonasfh

+0

由於您的位置和名稱是參數,因此您沒有問題。添加'%'for像不會損害任何東西,這是模式和實踐中較舊的鏈接,但它討論了存儲過程和存儲過程與動態SQL(你沒有使用動態SQL,所以你很好)https:// msdn。 microsoft.com/en-us/library/ff648339.aspx?f=255&MSPPError=-2147217396 –

回答

5

您發佈的代碼不容易受到SQL注入攻擊。連接在查詢中使用的字符串值是可以的,只有當您通過串聯字符串來構建查詢時,您纔是易受攻擊的。

對於駐留在T-SQL中的代碼,這意味着除非您使用的是EXECsp_executeSQL,否則您不可能受到攻擊。

一個例子就是相當於你的代碼,並容易受到SQL注入

BEGIN --Don't do this! 
    @location varchar(20),@name varchar(20) 
    sp_executesql(' 
    SELECT location, name 
    FROM table 
    WHERE (location LIKE ' + @location + '%'') AND (name LIKE ''%' + @name + '%''') 
END 
2

的這部分代碼,至少是好的。是的,您正在使用字符串連接,但在編譯後,連接發生在查詢的運行時。執行計劃已經確定,並且連接的結果僅被用作的值;從不作爲代碼。沒有辦法額外的'字符或任何其他可能導致該字符串的惡意元素泄漏出來,並被解釋爲SQL代碼。

字符串連接是與用戶數據SQL字符串一個問題,當它發生之前編譯 ...時間無論是在客戶端代碼級別,或在服務器上領先的exec()sp_executesql()或類似的,因爲結果的級聯有可能被解釋爲代碼。

當然,在這個程序中可能還有其他的東西,我們還沒有看到還有問題。

相關問題