我正在使用ssms进行查询,我想知道是否有任何未解决的漏洞。 flngKey字段将输入强制为int,而fstrWho字段的字符数限制为100。系统使用过滤器将其加倍以转义所有单引号。该服务器在unicode而非varchar上运行(希望可以防止unicode走私)。我还在绑定参数上使用VB.net严格模式。关于我未解决的任何漏洞有什么想法吗?
答案 0 :(得分:2)
当用户输入与动态sql连接时,SQL注入成为一个问题。
通常看起来像这样...
DECLARE @sql nvarchar(4000) = N'INSERT INTO table (flngKey, fstrWho) VALUES (' + @string_param_1 + N', N'''+ @string_param_2 + N''');'
按照设计,用户输入@ string_param_1和@ string_param_2 ...的值
DECLARE
@string_param_1 nvarchar(10) = N'12345',
@string_param_2 nvarchar(1000) = N'some value';
DECLARE @sql nvarchar(4000) = N'INSERT INTO table (flngKey, fstrWho) VALUES (' + @string_param_1 + N', N'''+ @string_param_2 + N''');'
EXEC (@sql);
并按照设计,创建并执行以下命令...
INSERT INTO table (flngKey, fstrWho) VALUES (12345, N'some value');
sql注入漏洞来自以下事实:它直接将参数值包含在命令中。因此,当错误的用户过长并输入了一组这样的值...
DECLARE
@string_param_1 nvarchar(10) = N'12345',
@string_param_2 nvarchar(1000) = N'some value''); select * from dbo.customer_billing_info; --';
DECLARE @sql nvarchar(4000) = N'INSERT INTO table (flngKey, fstrWho) VALUES (' + @string_param_1 + N', N'''+ @string_param_2 + N''');'
--EXEC (@sql);
PRINT(@sql);
现在正在生成的命令看起来像这样...
INSERT INTO table (flngKey, fstrWho) VALUES (12345, N'some value'); select * from dbo.customer_billing_info; --');