我有一个名为category的列表。列类别的值类似于“6,7,9,22,44”。我想知道这种方法对于SQL Server 2005或2008是否是一种有效的方法。我基本上将“6,7,9,22,44”值传递给存储过程。我是一个更好的方法的开放链接/建议。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ 注意:我应该澄清我正在维护由其他人编写的应用程序,并且类别列已经有逗号分隔值。我会把数据放在一个单独的表中,但我不能在短期内这样做。关于SQL注入 - 列由填充复选框列表中的值填充。用户无法输入或输入任何会影响特定存储过程的数据。在这种情况下,SQL注入是否仍然可行?请解释一下。谢谢。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~
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
答案 0 :(得分:2)
这是一个非常糟糕的主意,因为它使您的系统对SQL注入开放。恶意用户可能能够传入一个字符串,如“')DROP TABLE categoryTable - ”(注意字符串开头的单引号)或更糟糕的东西。
有很多方法可以保护自己免受SQL注入,并且有很多资源可供使用。我建议你自己研究它,因为它的面积太大,无法覆盖一个问题。
但是对于您的特定问题,我建议本网站了解如何创建表值参数以传入整数ID列表:http://www.sommarskog.se/arrays-in-sql-2008.html
它仅对SQL Server 2008有效,如果需要,您应该按照该文章中的链接获取SQL Server 2005的解决方案。
答案 1 :(得分:0)
正如杰克所说,这创造了SQL injection的可能性。 Sommarskog非常了解处理这个问题的方法:The Curse and Blessing of Dynamic SQL。