2010-11-01 3 views
4

Хранимая процедура выглядит следующим образом:Сохранена ли эта хранимая процедура от SQL-инъекции?

CREATE PROCEDURE Foo 
    @bar varchar(100) 
AS 

SELECT * FROM tablename 
WHERE columnname LIKE '%' + @bar + '%' 

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

+2

Это не T-SQL, который необходимо защитить, а код, вызывающий его. Можете ли вы показать код, на который вы звоните? – RPM1984

+0

Весь вход загрязнен. – Stephen

ответ

7

Если вы используете C# и ваш код выглядит следующим образом:

SqlCommand command = new SqlCommand("Foo", connection); 
command.CommandType = CommandType.StoredProcedure; 
command.Parameters.AddWithValue("@bar", myTextBox.Text); 

тогда да!

Если это выглядит следующим образом:

SqlCommand command = new SqlCommand("EXEC Foo '" + myTextBox.Text + "'", connection); 

то нет!

+1

+1, место на. Параметрированные запросы полностью (для тех слабых соков, которые все еще используют классический ado.net. EF4 FTW) – RPM1984

+0

Я попытался выполнить это в SQL Server Management Studio, и инъекция не состоялась. exec Foo '; тест тестовой таблицы;'. Можете ли вы привести пример того, как может быть введена вторая часть кода? –

+0

Я думаю, вы немного смущены тем, как работает SQL Injection. Это не то, что вы сделали бы с студией управления SQL Server. В моем примере установка 'zzzzzzzzzzzzzzzzzzzzz '; выберите 'i execute code here'; 'в myTextBox должен быть запущен нежелательный код. –

4

Да, это интерпретирует все данные внутри @bar как одно значение varchar (100). Вы все равно должны убедиться, что что-то передано в вашем приложении, поскольку LIKE '%%' по умолчанию будет возвращать все в вашей БД.

+0

+1 для обозначения недостатка 'LIKE %%'. – RPM1984

+0

Я буду применять непустое значение строки, которое будет передано в хранимую процедуру. Благодарю. –

Смежные вопросы