存储过程注入
在上一篇《如何防范SQL注入—编程篇》中,我们提到使用存储过程是能够防范SQL注入的,但同时也要注意,存储过程如果使用不得当,使用存储过程的动态查询事实上也会造成一定的SQL注入漏洞。
以下面的SQL存储过程为例:
Create procedure user_login @username varchar(20), @passwd varchar(20) As
Declare @sqlstring varchar(250)
Set @sqlstring = ‘
Select 1 from users
Where username = ‘ + @username + ‘ and passwd = ‘ + @passwd
exec(@sqlstring)
Go
Declare @sqlstring varchar(250)
Set @sqlstring = ‘
Select 1 from users
Where username = ‘ + @username + ‘ and passwd = ‘ + @passwd
exec(@sqlstring)
Go
用户的输入如下:
anyusername or 1=1'
anypassword
anypassword
如果我们没有对输入进行验证,那么上面的语句就回返回数据库中的一条记录。
我们再看下面的一条:
Create procedure get_report @columnamelist varchar(7900) As
Declare @sqlstring varchar(8000)
Set @sqlstring = ‘
Select ‘ + @columnamelist + ‘ from ReportTable‘
exec(@sqlstring)
Go
Declare @sqlstring varchar(8000)
Set @sqlstring = ‘
Select ‘ + @columnamelist + ‘ from ReportTable‘
exec(@sqlstring)
Go
如果用户输入是:
1 from users; update users set password = 'password'; select *
后面则显而易见,用户的所有密码都被更改且得到了报表信息。