У меня есть приложение (Crystal Reports), которое вставляет параметры пользователя непосредственно в выполняемый запрос.
Характер запросов, которые мне нужно выполнить, означает Я не могу изменить это поведение.
Я обнаружил, что это позволяет пользователям запускать любые команды SQL, которые им нравятся, через отчет.
Например, мой запрос SQL выглядит примерно так:
declare @text varchar(100)
set @text = '{users parameter}'
select *
from blah
where blah.field = @text
-- rest of query
Поэтому, если пользователь установит параметр на '; select * from blah; --
, он выполнит этот запрос.
Я уже запускаю команду от имени очень ограниченного пользователя, но все еще хочу попытаться предотвратить инъекции.
Есть ли способ предотвратить или хотя бы смягчить их с помощью выполняемого мной запроса?
Что-то вроде:
declare @text varchar(100)
set @text = NeverEscape('{users parameter}')
select *
from blah
where blah.field = @text
-- rest of query
Редактировать
Чтобы выяснить, какова уязвимость, приложение передает один текстовый запрос на сервер, в приведенном мной примере на сервер будет передан следующий запрос:
declare @text varchar(100)
set @text = ''; select * from blah; --'
select *
from blah
where blah.field = @text
-- rest of query