所谓Sql注入,就是利用动态构建Sql语句的操作,在输入参中增加额外sql信息从而在执行该操作时顺带进行
额外的地数据库操作的攻击方式。
使用存储过程可以很大程度上避免Sql注入攻击,但是并不能避免Sql注入功能。只要存在Sql语句动态生成,
而传入参包括字符串,就可以产生Sql注入。
目前在存储过程中需要进行Sql语句动态生成的基本是因为条件语句的动态形成,比如组合查询,条件更新,
条件删除。因为这类语句如果进行完全罗列将会是xx性的工作量。
目前比较完整的防御措施如下:
1.对于存在动态生成语句的存储过程的调用,对于传入字符串参数进行特殊字符替换:%='",:
额外的地数据库操作的攻击方式。
使用存储过程可以很大程度上避免Sql注入攻击,但是并不能避免Sql注入功能。只要存在Sql语句动态生成,
而传入参包括字符串,就可以产生Sql注入。
目前在存储过程中需要进行Sql语句动态生成的基本是因为条件语句的动态形成,比如组合查询,条件更新,
条件删除。因为这类语句如果进行完全罗列将会是xx性的工作量。
目前比较完整的防御措施如下:
1.对于存在动态生成语句的存储过程的调用,对于传入字符串参数进行特殊字符替换:%='",:
2.使用sp_executesql格式化语句执行来执行动态语句
例子:
根据角色ID或者角色名进行组合条件查询一个角色信息。
存储过程如下:
Alter PROCEDURE [dbo].[SP_TestSqlInject]
(
@iCharId bigint,
@strName nvarchar(32)
)
AS
BEGIN
SET NOCOUNT ON;
declare @sqlStr nvarchar(2048);
declare @paramDefine nvarchar(2048);
set @sqlStr = 'select * from TableChar where ';
if @iCharId != 0
set @sqlStr = @sqlStr + 'iCharId = @pICharId and ';
if @strName != NULL
set @sqlStr = @sqlStr + 'strName = @pStrName and '
set @sqlStr = @sqlStr + ' 1 = 1'
set @paramDefine = '@pICharId bigint, @pStrName nvarchar(32)';
exec sp_executesql @sqlStr, @paramDefine, @iCharId, @strName;
End
go