是在sql的参数中加入 ';' 实现的. 因为 ';' 在sql里表示一个新命令的开始.
比如有这样一个sp
procedure sp1
@p1 CHAR(50)
as
exec('select * from tab1 where ' + @p1)
go
设计者想的是转入像
name='testName'
name='testName' and age=15
这样的参数,但hacker们会转入这样的参数
;delete from tab1 (如果他知道你的表名)
;shutdown (关闭server)
;xp_*(sql server内置的一些sp,可对server进行任何操作)
所以写sp时,最好能写成
procedure sp2
@p2 CHAR(50)
as
select * from tab1 where name=@p2
go
但,如果where-clause后的条件不定的话,也只能用第一种方法了. 这时一定要记得对参数进行检查, 最好是在front-end时行检查,以减轻server的负担