Возможно ли внедрение SQL, когда тип параметра не установлен? - PullRequest
4 голосов
/ 17 августа 2010

Гарантирует ли передача параметров SQL одной только хранимой процедуре, что SQL-инъекция не произойдет или проверки типов также должны быть выполнены?

Как пример -
Код ADO.NET:

    Database DBObject = DataAccess.DAL.GetDataBase();
    DbCommand command = DBObject.GetStoredProcCommand("usp_UpdateDatabase");
    List<DbParameter> parameters = new List<DbParameter>();
    parameters.Add(new SqlParameter("@DbName", txtName.Text));
    parameters.Add(new SqlParameter("@DbDesc", txtDesc.Text));
    command.Parameters.AddRange(parameters.ToArray());
    rowsAffected = DBObject.ExecuteNonQuery(command);

SP:

ALTER PROCEDURE [dbo].[usp_GetSearchResults] 
 -- Add the parameters for the stored procedure here
  @DbName NVARCHAR(50)  = ''
 ,@DbDesc NVARCHAR(50)  = ''

AS
BEGIN
  SET NOCOUNT ON; 
  SELECT     [RegionName]
            ,[AppName]
  FROM  [ApplicationComponent]
  WHERE [DBName]  LIKE ('%' + @DbName+ '%')
  OR    [DBDesc]  LIKE ('%' + @DbDesc+ '%')
END

В приведенном выше коде я не упомянул какие-либо типы параметров или логику проверки. Будет ли это все еще делать SQL-инъекцию?

Спасибо за руководство!

Ответы [ 4 ]

8 голосов
/ 17 августа 2010

Нет, это должно быть хорошо. Значение в предложении LIKE все еще создается как строковое значение, а не интерпретируется как часть оператора SQL. Он по-прежнему рассматривается как data , а не code , и это важнейшая часть предотвращения атак с использованием SQL-инъекций.

2 голосов
/ 17 августа 2010

Да, это все равно должно защищать вас от SQL-инъекций.

Вы не динамически строите строку SQL в своем коде .NET и не используете sp_execute для динамического построения и выполнения оператора SQL вваша хранимая процедура.

0 голосов
/ 17 августа 2010

Я бы все же предложил использовать типизированные параметры. Несмотря на то, что реализация ловит любые попытки внедрения, КАК СЕЙЧАС, нет никакой реальной гарантии, что это будет иметь место в будущем - и, надеюсь, ваше приложение будет жить долго и процветать ... =)

Что касается SQL Server, статью MSDN на эту тему можно найти здесь: http://msdn.microsoft.com/en-us/library/ff648339.aspx

0 голосов
/ 17 августа 2010

Значение по умолчанию DbType для SQLParameter равно NVarChar (согласно документам ), так что это тип, который будут иметь ваши параметры.

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

...