Безопасен ли этот запрос INSERT INTO SSMS от внедрения SQL? - PullRequest
0 голосов
/ 26 июня 2019

Я работаю над запросом с использованием ssms и мне интересно, есть ли какие-либо уязвимости, которые я оставил открытыми. Поле flngKey заставляет input быть целым числом, а поле fstrWho имеет ограничение на число символов 100. Система использует фильтр, чтобы экранировать все одинарные кавычки, удваивая его. Сервер работает на юникоде, а не на varchar (мы надеемся защитить его от контрабанды юникода). Я также использую строгий режим VB.net с параметрами связывания. Любые идеи по поводу каких-либо уязвимостей, которые я оставил открытыми?

VB.NET SQL

1 Ответ

2 голосов
/ 26 июня 2019

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; --');
...