mssql sqlserver 查询语句之参数化处理


摘要:
在项目中,所有的sql语句参数化,可以避免出现sql注入式漏洞,
参数化也成为注入式漏洞最直接的避免方式
下文讲述分页sql中如何进行将输入参数参数化


 create table A(keyId int identity,name varchar(10))
go
insert into A(name)values('a'),('b'),('c''')
insert into A(name)values('d'),('e'),('f')
insert into A(name)values('g'),('h'),('i')
go

/**/
declare @topSize int 
set @topSize = 2 
select top  (@topSize)  * from A
----------------返回2行数据--------
go
---如果后面有查询条件的话,须使用拼接字符串的方式运行,
---就会产生注入式漏洞,如下:
/*
declare @topSize int 
set @topSize = 2 
declare @name varchar(10)
set @name ='c''' ----采用拼接字符串的方式,如果字符串中有单引号也会产生相应的异常
declare @sql varchar(max)
set @sql = 'select top ('+convert(varchar(10),@topSize)+') * from A where name ='''+@name+''''
print (@sql)
exec(@sql) 
go
*/

-----正确的参数化方式,我们应该采用sp_executesql来执行sql语句,并参数化
declare @topSize int 
set @topSize = 2 
declare @name varchar(10)
set @name ='c''' ----采用拼接字符串的方式,如果字符串中有单引号也会产生相应的异常
declare @sql nvarchar(max)
set @sql = 'select top  (@topSize)  * from A where name = @name '

exec sp_executesql @sql,
N'@topSize as int,@name as nvarchar(10)', 
@topSize = @topSize,@name=@name
go
mssql_sqlserver_查询语句参数化处理

mssql_sqlserver_查询语句参数化处理