复杂的sp_executesql-易受注入攻击?
刚开始一项新工作,我发现对sp_executesql(SQL Server 2008 R2)的调用异常复杂。我无法确定它是否容易受到SQL注入的攻击 以下内容定义为单个C#复杂的sp_executesql-易受注入攻击?,sql,sql-server,tsql,dynamic-sql,sp-executesql,Sql,Sql Server,Tsql,Dynamic Sql,Sp Executesql,刚开始一项新工作,我发现对sp_executesql(SQL Server 2008 R2)的调用异常复杂。我无法确定它是否容易受到SQL注入的攻击 以下内容定义为单个C#字符串(因此没有额外的转义): 然后整批都按原样执行 exec sp_executesql @query, N'@code nvarchar(500)',@code=N'..something..' 因此,@code在insert语句中使用得当,但在构建@dyn时使用不当(还有@names,其中一个名称字段可能包含恶意脚本)
字符串
(因此没有额外的转义):
然后整批都按原样执行
exec sp_executesql @query, N'@code nvarchar(500)',@code=N'..something..'
因此,@code
在insert语句中使用得当,但在构建@dyn
时使用不当(还有@names
,其中一个名称字段可能包含恶意脚本)
这似乎是一种糟糕的代码味道,但我似乎无法为执行任意SQL的@code
编写一个值。我也没有权力强行解决这个问题
有人知道这种东西是否安全吗?谢谢这看起来像经典的动态
PIVOT
declare @temp table(keyid int IDENTITY(1,1) PRIMARY KEY, name nvarchar(50));
insert into @temp (name)
select distinct name from SOMEWHERE where code=@code;
declare @names nvarchar(max)
,@dyn nvarchar(max);
-- dynamically build the columns
select @names = Stuff ((select ','+ QUOTENAME(name)
from @temp
order by name
for XML PATH('') ),1,1,'');
-- dynamically build the pivot query
set @dyn =
N'select '+ @names +' from (select name, score from TABLE where code=@code)
as p PIVOT
(max(score) for name in ('+ @names +')) as pivtab';
execute dbo.sp_executesql
@dyn,
N'@code DATATYPE',
@code;
我想:
],[
(与良好实践一样)@code
(可能的攻击向量,用户可以传递恶意代码)PIVOT
,请执行此操作
我还建议您阅读如果动态透视非常复杂,您可能看不到非常复杂的查询。但是它安全吗?我不喜欢这样使用动态SQL。我会在应用程序层透视它。@代码对于OneHanks是可编辑的,这非常有用-我没有想到将@code指定为内部查询的参数ry.@jane0027这样做您确信像
blablabla';DROP TABLE…;--
这样的代码是参数化的。+1…值得指出的是,根据建议的更改,代码不应该容易受到攻击,因为名称来自系统表并正确引用。原始代码可能会受到以“@代码开头的附加攻击一个单引号。@GordonLinoff我不喜欢连接[
,因为有一些边缘情况,比如如果你尝试concat版本,你会得到无效的标识符。谢谢你的有用建议。我将推动将轴心移动到C#(动态查询有大量列..并且它们会随着时间的推移而增长)调试动态SQL有什么有用的资源吗?我能从SQLMS和分析器中得到的只是初始调用,而不是内部构造的调用。
declare @temp table(keyid int IDENTITY(1,1) PRIMARY KEY, name nvarchar(50));
insert into @temp (name)
select distinct name from SOMEWHERE where code=@code;
declare @names nvarchar(max)
,@dyn nvarchar(max);
-- dynamically build the columns
select @names = Stuff ((select ','+ QUOTENAME(name)
from @temp
order by name
for XML PATH('') ),1,1,'');
-- dynamically build the pivot query
set @dyn =
N'select '+ @names +' from (select name, score from TABLE where code=@code)
as p PIVOT
(max(score) for name in ('+ @names +')) as pivtab';
execute dbo.sp_executesql
@dyn,
N'@code DATATYPE',
@code;