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