Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复杂的sp_executesql-易受注入攻击?_Sql_Sql Server_Tsql_Dynamic Sql_Sp Executesql - Fatal编程技术网

复杂的sp_executesql-易受注入攻击?

复杂的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,其中一个名称字段可能包含恶意脚本)

刚开始一项新工作,我发现对sp_executesql(SQL Server 2008 R2)的调用异常复杂。我无法确定它是否容易受到SQL注入的攻击

以下内容定义为单个C#
字符串
(因此没有额外的转义):

然后整批都按原样执行

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;