У меня есть хранимая процедура в SQL Server, которая получает XML в качестве входного параметра.В этом XML определяется - какая хранимая процедура, с какими параметрами должны выполняться значения.И в соответствии с тем, что хранимая процедура выполняет требуемую процедуру с использованием динамического SQL с sp_executesql
.
Проблема в том, что значения параметров уязвимы для внедрения SQL.
Я пытался использоватьТипизированные параметры вот так:
EXEC sys.sp_executesql
@stmt = @sql,
@params = N'@Username SYSNAME, @HireDate DATE',
@UserName = @Username, @HireDate = @HireDate;
Но в моем случае это не сработает, потому что я не знаю, какая процедура с какими параметрами будет выполняться.Количество параметров может варьироваться, и некоторые из них являются необязательными / имеют значения по умолчанию и т. Д. Все, что я могу получить, это имена параметров в виде строки :(
После некоторого анализа входного XML-кода SQL-запрос строитсяи выполняется так
declare @params nvarchar(max);
select @params = coalesce(@params + N', ', N' ') + r.attrName + N' = ' + iif(p.isNumericType = 1, r.Value, '''' + r.Value /*cast(r.Value as nvarchar(max))*/ + '''') --+ r.Value
from dbo.#ruleConfig r
left join @spParams p on p.paramName = r.attrName -- datatype of a parameter from information_schema.parameters
declare @sql nvarchar(max) = (select @procName + isnull(@params, N''));
exec dbo.sp_executesql @sql
Значение @sql может выглядеть примерно так:
'core.GetUser @LogonName = 'myDomain\myLogon''
Но также может выглядеть так:
'core.GetUser @fullLogonName = 'myDomain\myLogon;'WAITFOR DELAY '0:0:20';--'' and that's the problem.