此INSERT INTO SSMS查询对SQL注入安全吗?

时间:2019-06-26 15:27:29

标签: sql sql-server sql-injection sanitization

我正在使用ssms进行查询,我想知道是否有任何未解决的漏洞。 flngKey字段将输入强制为int,而fstrWho字段的字符数限制为100。系统使用过滤器将其加倍以转义所有单引号。该服务器在unicode而非varchar上运行(希望可以防止unicode走私)。我还在绑定参数上使用VB.net严格模式。关于我未解决的任何漏洞有什么想法吗?

VB.NET SQL

1 个答案:

答案 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; --');