Недавно было проверено на хранимой процедуре, закодированной предшественниками для выполнения некоторых CRUD. Это влияет на некритические таблицы в производственной базе данных. Я чувствую, что он уязвим для SQL-инъекций, но кажется, что инъекция действительно безвредна, поскольку она выполняет CRUD на некритических таблицах.Сколько вреда может вызвать SQL-инъекция через эту хранимую процедуру?
Параметр @LocalDatabase передается из файла connectionString="Server=localHost;Database=localDatabase;..."
в файле конфигурации.
Мне было интересно, может ли возможная инъекция SQL в этом конкретном SP может катастрофически повредить производственную базу данных? Я взвешиваю экономическую выгоду для перезаписи всего этого модуля.
ALTER PROCEDURE StoredProc_Name
(
@LocalDatabase varchar(50),
@Result int OUTPUT
)
SET @Sql = N'UPDATE <Production Database>.Table1
SET ...
FROM <Production Database>.NewTable INNER JOIN
'+ @LocalDatabase +'.dbo.Table1 ON ... INNER JOIN
'+ @LocalDatabase +'.dbo.Table2 ON ...
WHERE NOT EXISTS(SELECT 1
FROM <Production Database>.dbo.Table2
WHERE .....)'
EXEC(@Sql)
SET @Result = @@ROWCOUNT
Оцените любые рекомендации или помощь в обращении в нужном направлении. Заранее спасибо.
Независимо от угрозы SQL-инъекции ... это действительно плохая практика, я настоятельно рекомендую вам переделать этот код. –
@SufyanJabr почему это так? Могу ли я получить некоторые идеи, чтобы я мог лучше обосновать свое дело, чтобы переписать модуль? Я знаю ... «Он справляется с работой». – f0rfun
Я не знаю конкретного случая, который у вас есть, но с помощью Exec путем объединения SQL является одной из очень плохих практик, и ее следует избегать. Из того, что я вижу, вы пытаетесь переключить базы данных на основе параметра, почему бы вам не сделать это в строке подключения? –