如果未设置参数类型,是否可以进行SQL注入?

时间:2010-08-17 13:41:23

标签: c# sql ado.net sql-injection

将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 个答案:

答案 0 :(得分:8)

不,那应该没问题。 LIKE子句中的值仍然构建为字符串值,而不是被解释为SQL语句的一部分。它仍然被视为数据而不是代码,这是避免SQL注入攻击的关键部分。

答案 1 :(得分:2)

是的,这仍然可以保护您免受SQL注入。

您没有在.NET代码中动态构建SQL字符串,并且您没有使用sp_execute在存储过程中动态构建和执行SQL语句。

答案 2 :(得分:0)

DbType的默认SQLParameterNVarChar(根据docs),因此这是您的参数所具有的类型。

无论如何,即使参数类型错误,你最糟糕的事情就是类型转换异常,而不是SQL注入。

答案 3 :(得分:0)

我仍然建议使用输入参数。 虽然实现捕获任何注射尝试AS FOR NOW,但没有真正的保证,这将是下线 - 并希望您的应用程序将导致漫长而繁荣的生命... =)

关于SQL Server,可以在此处找到有关该主题的MSDN文章: http://msdn.microsoft.com/en-us/library/ff648339.aspx