存儲過程如下:這個存儲過程是否安全,避免SQL注入?
CREATE PROCEDURE Foo
@bar varchar(100)
AS
SELECT * FROM tablename
WHERE columnname LIKE '%' + @bar + '%'
我已經試過各種傳遞字符串此存儲過程,但對我來說,它看起來像這將是安全的,因爲從之間的一切SQL注入和包括通配符會導致在一個單一的字符串。
存儲過程如下:這個存儲過程是否安全,避免SQL注入?
CREATE PROCEDURE Foo
@bar varchar(100)
AS
SELECT * FROM tablename
WHERE columnname LIKE '%' + @bar + '%'
我已經試過各種傳遞字符串此存儲過程,但對我來說,它看起來像這將是安全的,因爲從之間的一切SQL注入和包括通配符會導致在一個單一的字符串。
如果您正在使用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,現貨。參數化查詢(對於那些仍然使用經典ado.net EF4 FTW的窮人) – RPM1984 2010-11-01 22:09:24
我試圖在SQL Server Management Studio中執行此操作,並且沒有發生注入。 exec Foo'; drop table test;'。你能否提供一個第二段代碼如何被注入的例子? – 2010-11-01 22:46:28
我認爲你對SQL注入的工作原理有些困惑。這不是你從SQL Server管理工作室做的事情。在我的例子中放入'zzzzzzzzzzzzzzzzzzzzz';選擇'我在這裏執行的代碼';'進入myTextBox應該導致不需要的代碼被執行。 – 2010-11-01 22:58:18
是的,這會將@bar中的所有數據解釋爲單個varchar(100)值。您仍然應該確保在您的應用中傳遞了某些內容,因爲LIKE'%%'將默認返回數據庫中的所有內容。
+1提到'LIKE %%'缺陷。 – RPM1984 2010-11-01 22:09:49
我將強制傳遞給存儲過程的非空字符串值。謝謝。 – 2010-11-01 22:41:51
這不是需要保護的T-SQL,而是調用它的代碼。你能顯示你的代碼嗎? – RPM1984 2010-11-01 21:59:53
所有輸入都很髒。 – Stephen 2010-11-01 22:02:01