2017-01-09 6 views
-2

необходимо немного помочь с этой проблемой впрыска sql:SQL-инъекция с параметризованными процедурами

Ниже приведена версия параметризованной хранимой процедуры. Исключая, как он вызван из приложения, существует ли способ предотвратить обращение @v_string к динамическому SQL?

Я думаю, что это довольно непроницаемый для воды - нет исполняемого или объединенного sql, но все же вставка точки с запятой позволяет возвращать дополнительные данные.

Я знаю, что есть несколько уровней, чтобы рассмотреть этот вопрос, но я хочу знать, есть ли какое-то простое решение, которое мне не хватает здесь, поскольку большинство исправлений для инъекций связаны с динамическими запросами.

create table dbo.Employee (EmpID int,EmpName varchar(60)) 


declare 
    @v_id int, 
    @v_string varchar(60) 
begin 

    set @v_string='test'''; waitfor delay '0:0:5' -- 

    if @v_id is null 

    begin 
     set @v_id =   (select EmpID 
           from  Abc.Employee 
           where [email protected]_string); 
    end 


    print @v_id 
end 
+0

Единственный раз, когда вы получите в беду, если СП использует параметры в запросе, непосредственно предоставленный пользователем, и они непосредственно объединяются в оператор выбора (в отличие от того параметры). –

+0

"Вставка точки с запятой позволяет возвращать дополнительные данные". Я не вижу, как это может произойти. Можете ли вы дать нам подробную информацию о том, где вы вставляете эту точку с запятой, и как вы знаете, что из-за этого возвращаются дополнительные данные? –

+0

замените задержку ожидания с помощью select * from sys.databases –

ответ

2

есть в любом случае, чтобы предотвратить @v_string от рассматривается как динамический SQL?

Я бы не стал ожидать @v_string следует рассматривать как динамический SQL здесь, так как код T-SQL не имеет EXECUTE или EXECUTE sp_executeSQL. Значение не будет выполнено, но рассматривается как значение WHERE, не уязвимое для SQL-инъекции.

Если это не ответит на ваш вопрос, напишите полный пример, демонстрирующий значение, которое обрабатывается как динамический SQL.

+0

для краткости, как указано выше: набор '@ v_string = 'test' ''; waitfor delay '0: 0: 5' - это значение, которое передается. Насколько я могу видеть, когда выполняется второй набор, выполняется исполняемый SQL-код –

+0

Значение @v_string передается запросу, но значение внутри не выполняется. Код в вашем обновленном вопросе не показывает проблему, о которой вы беспокоитесь. –

2

Вы сбиты с толку вашим собственным тестированием. Линия:

set @v_string='test'''; waitfor delay '0:0:5' -- 

создает строку @v_string со значением test', а затем выполнение waitfor delay '0:0:5'. Затем выполняется ваш фактический запрос Employee.

Так что, если вы запустите запрос, как есть, с дополнительным, например:

set @v_string='test'''; select * from sys.databases 

... что будет происходить в том, что строка кода будет установлен @v_string быть test', а затем сразу же выполнить select * from sys.databases. Затем остальная часть вашего кода будет запущена, выполняя ваш фактический выбор. Таким образом, вы будете видеть результата select * from sys.databases, а затем в результате вашего Employee запроса, но только потому, что вы на самом деле жестко заявление select * from sys.databases в вашу процедуру, не понимая, что это :)

Если вы хотите строку @v_string который должен быть установлен в test'; waitfor delay '0:0:5', то у вас есть got the string quoting неправильно. Оно должно быть:

set @v_string='test''; waitfor delay ''0:0:5''' 
+0

Действительно, вы можете видеть это из подсветки синтаксиса. – Ben