2012-03-05 32 views
0

我有一個表有一個名爲category的列。列類別的值爲「6,7,9,22,44」。我想知道這種方法是否是SQL Server 2005或2008的高效方法。我基本上將「6,7,9,22,44」值傳遞給存儲過程。我是一個更好的方法的開放鏈接/建議。動態sql - 這是一個好方法嗎?

~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ 注意:我應該澄清,我正在維護一個由其他人編寫的應用程序,並且類別列已經有逗號分隔值。我會將數據放在一個單獨的表格中,但短期內我無法做到這一點。關於SQL注入 - 該列由從複選框列表中檢查的值填充。用戶不能輸入或輸入任何會影響特定存儲過程的數據。在這種情況下SQL注入仍然可能嗎?請解釋如何。謝謝。 35~~~

CREATE PROCEDURE [dbo].[GetCategories] 
    -- Add the parameter that contain the string that is passed in 
    @catstring varchar(300) 
AS 
DECLARE @SQLQuery nvarchar(500); 
BEGIN 

    /* Build Transact-SQL String with parameter value */ 
    SET @SQLQuery = 'select id,category from categoryTable where id in ('+ @catstring +')' 
    /* Execute Transact-SQL String */ 
    EXECUTE(@SQLQuery) 
END 
GO 
+3

不可以。您的代碼容易受到[SQL注入](http://bobby-tables.com/)的影響。 – 2012-03-05 20:50:33

+0

將逗號分隔的值存儲在列中並不好。 – 2012-03-05 20:53:11

+0

您是否使用C#或其他服務器端編程語言? – Meryovi 2012-03-05 20:58:49

回答

2

這是一個非常糟糕的主意,因爲這會使你的系統開放的SQL注入。惡意用戶可能能夠傳遞字符串,例如「'DROP TABLE categoryTable - 」(注意字符串開頭的單引號),或者更糟的事情。

有很多方法可以保護您免受SQL注入攻擊,並且有大量資源。我建議你自己研究一下,因爲它在單個問題中覆蓋範圍太大。

要不是你的具體問題,我建議這個網站,以瞭解如何創建一個表值參數的整數ID的列表來傳遞:http://www.sommarskog.se/arrays-in-sql-2008.html

這僅適用於SQL Server 2008,您應遵循如果需要的話,可以在那篇文章中找到SQL Server 2005解決方案的鏈接。

相關問題