我有一个表,它有一个名为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发布于 2012-03-06 04:56:42
这是一个非常糟糕的想法,因为它会让您的系统对SQL注入敞开大门。恶意用户可能会传入类似"') DROP TABLE categoryTable --“(注意字符串开头的单引号)之类的字符串,或者更糟的字符串。
保护自己免受SQL注入攻击的方法有很多,而且有大量的资源。我建议你自己研究它,因为它太大了,不能用一个问题来涵盖。
但是对于您的特殊问题,我建议这个网站学习如何创建一个表值参数来传递一个整数I列表:http://www.sommarskog.se/arrays-in-sql-2008.html
它只对SQL Server2008有效,如果需要,您可以按照该文章中的链接找到针对SQL Server2005的解决方案。
发布于 2012-03-06 04:58:41
正如杰克所说,这创造了SQL injection的可能性。Sommarskog在The Curse and Blessing of Dynamic SQL上很好地研究了不同的处理方法。
https://stackoverflow.com/questions/9573740
复制相似问题