首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态sql --这是一种好方法吗?

动态sql --这是一种好方法吗?
EN

Stack Overflow用户
提问于 2012-03-06 04:46:58
回答 2查看 127关注 0票数 0

我有一个表,它有一个名为category的列。列类别的值类似于"6,7,9,22,44“。我想知道对于SQL Server 2005或2008,这种方法是否有效。基本上,我将"6,7,9,22,44“值传递给存储过程。我开放链接/建议,以获得更好的方法。

注意:我应该澄清的是,我正在维护一个由其他人编写的应用程序,并且类别列已经有逗号分隔值。我会将数据放在一个单独的表中,但我在短期内无法做到这一点。关于SQL注入-该列由复选框列表中选中的值填充。用户不能键入或输入任何会影响该特定存储过程的数据。在这种情况下,SQL注入仍然可行吗?请解释一下如何操作。谢谢。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 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的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2012-03-06 04:58:41

正如杰克所说,这创造了SQL injection的可能性。Sommarskog在The Curse and Blessing of Dynamic SQL上很好地研究了不同的处理方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9573740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档