sp_execute SQL vs exec
正如我在下面的博客中读到的 动态sql是不安全的,这就是为什么我们有sp_执行sql 请问,有没有办法让sp_execute运行这样的过程sp_execute SQL vs exec,sql,tsql,stored-procedures,dynamic,sql-server-2000,Sql,Tsql,Stored Procedures,Dynamic,Sql Server 2000,正如我在下面的博客中读到的 动态sql是不安全的,这就是为什么我们有sp_执行sql 请问,有没有办法让sp_execute运行这样的过程 declare @QueryMain as varchar(8000) declare @QueryBody as varchar(8000) declare @QueryWhere as varchar(8000) set @QueryMain = <8000 charactes> set @QueryBody = <8000 cha
declare @QueryMain as varchar(8000)
declare @QueryBody as varchar(8000)
declare @QueryWhere as varchar(8000)
set @QueryMain = <8000 charactes>
set @QueryBody = <8000 characters>
set @QueryWhere = <8000 characters>
exec (@queryMain+@QueryBody+@QueryWhere)
将@QueryMain声明为varchar(8000)
将@QueryBody声明为varchar(8000)
将@QueryWhere声明为varchar(8000)
set@QueryMain=
set@QueryBody=
设置@QueryWhere=
exec(@queryMain+@QueryBody+@QueryWhere)
这将运行,但正如我在文章中读到的,不建议使用。。。但我想知道是否有其他方法来运行这种查询。。。我试图将这3个变量合并到ntext中,但没有成功,顺便说一句。。。上面的示例查询将在查询中包含其他变量,可以是日期、用户ID、任何内容
我正在使用sql server 2000 btw。。。正如我在谷歌上搜索到的,我没有发现如何为sql server 2000操作大字符串的结果,但我有SQLi攻击的后果。如果你问你是否可以这样做:
EXEC sp_executesql @QueryMain + @QueryBody + @QueryWhere;
否,不能将表达式或公式作为参数值。但你为什么要这么做?解决方法很简单,只需将它们附加到一个中间变量中(这应该是NVARCHAR(MAX)
,而不是NTEXT
,后者既不推荐使用,也对局部变量无效):
事实上,所有这些变量都应该是NVARCHAR
请参阅。如果您询问是否可以这样做:
EXEC sp_executesql @QueryMain + @QueryBody + @QueryWhere;
否,不能将表达式或公式作为参数值。但你为什么要这么做?解决方法很简单,只需将它们附加到一个中间变量中(这应该是NVARCHAR(MAX)
,而不是NTEXT
,后者既不推荐使用,也对局部变量无效):
事实上,所有这些变量都应该是NVARCHAR
请参阅。为什么要运行此类查询?您将始终拥有实际的SQL语句,因为您正在构建它。你是想让它从一段代码中运行吗?@twoleggedhorse因为我正在将每个sql脚本从系统迁移到存储过程中,经过我的测试,sql脚本很容易受到sql注入的攻击。它们是由过去的程序员开发的遗留系统,忽略了这种威胁的风险。为什么要运行这种查询?您将始终拥有实际的SQL语句,因为您正在构建它。你是想让它从一段代码中运行吗?@twoleggedhorse因为我正在将每个sql脚本从系统迁移到存储过程中,经过我的测试,sql脚本很容易受到sql注入的攻击。他们认为我们是由过去的程序员开发的遗留系统,并且忽略了这种威胁的风险。@Aaron_bertrand我之所以不使用nvarchar(max)是因为我们只有sql server 2000,而这个版本不支持nvarchar(max),但我正在将系统中嵌入的所有sql脚本迁移到存储过程中,并降低sql的风险injections@Joshua抱歉,我错过了SQL Server 2000标记。但是我认为你给了自己一种虚假的安全感。。。为什么您认为使用一堆未经验证的文本并使用sp_executesql执行比使用EXEC更安全?sp_executesql之所以更安全,是因为它促进了强类型参数的使用,而不是因为它神奇地阻止了自身的注入。您不打算以有助于IMHO的方式使用它,所以请继续使用EXEC。@Aaron_bertrand感谢您的澄清,我真的很想了解更多。谢谢你的知识,先生@Aaron_bertrand我之所以不使用nvarchar(max)是因为我们只有sql server 2000,而这个版本还不支持nvarchar(max),我正在将系统中嵌入的每个sql脚本迁移到存储过程中,以降低sql的风险injections@Joshua抱歉,我错过了SQL Server 2000标记。但是我认为你给了自己一种虚假的安全感。。。为什么您认为使用一堆未经验证的文本并使用sp_executesql执行比使用EXEC更安全?sp_executesql之所以更安全,是因为它促进了强类型参数的使用,而不是因为它神奇地阻止了自身的注入。您不打算以有助于IMHO的方式使用它,所以请继续使用EXEC。@Aaron_bertrand感谢您的澄清,我真的很想了解更多。谢谢你的知识,先生!