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

Die*_*kes 4 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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我没有提到任何参数类型或验证逻辑.它仍然会进行SQL注入吗?

谢谢你的指导!

Jon*_*eet 8

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