2010-11-01 94 views
4

存儲過程如下:這個存儲過程是否安全,避免SQL注入?

CREATE PROCEDURE Foo 
    @bar varchar(100) 
AS 

SELECT * FROM tablename 
WHERE columnname LIKE '%' + @bar + '%' 

我已經試過各種傳遞字符串此存儲過程,但對我來說,它看起來像這將是安全的,因爲從之間的一切SQL注入和包括通配符會導致在一個單一的字符串。

+2

這不是需要保護的T-SQL,而是調用它的代碼。你能顯示你的代碼嗎? – RPM1984 2010-11-01 21:59:53

+0

所有輸入都很髒。 – Stephen 2010-11-01 22:02:01

回答

7

如果您正在使用C#和您的代碼如下所示:

SqlCommand command = new SqlCommand("Foo", connection); 
command.CommandType = CommandType.StoredProcedure; 
command.Parameters.AddWithValue("@bar", myTextBox.Text); 

然後是的!

如果它看起來像這樣:

SqlCommand command = new SqlCommand("EXEC Foo '" + myTextBox.Text + "'", connection); 

則沒有!

+1

+1,現貨。參數化查詢(對於那些仍然使用經典ado.net EF4 FTW的窮人) – RPM1984 2010-11-01 22:09:24

+0

我試圖在SQL Server Management Studio中執行此操作,並且沒有發生注入。 exec Foo'; drop table test;'。你能否提供一個第二段代碼如何被注入的例子? – 2010-11-01 22:46:28

+0

我認爲你對SQL注入的工作原理有些困惑。這不是你從SQL Server管理工作室做的事情。在我的例子中放入'zzzzzzzzzzzzzzzzzzzzz';選擇'我在這裏執行的代碼';'進入myTextBox應該導致不需要的代碼被執行。 – 2010-11-01 22:58:18

4

是的,這會將@bar中的所有數據解釋爲單個varchar(100)值。您仍然應該確保在您的應用中傳遞了某些內容,因爲LIKE'%%'將默認返回數據庫中的所有內容。

+0

+1提到'LIKE %%'缺陷。 – RPM1984 2010-11-01 22:09:49

+0

我將強制傳遞給存儲過程的非空字符串值。謝謝。 – 2010-11-01 22:41:51

相關問題