将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注入吗?
感谢您的指导!
答案 0 :(得分:8)
不,那应该没问题。 LIKE子句中的值仍然构建为字符串值,而不是被解释为SQL语句的一部分。它仍然被视为数据而不是代码,这是避免SQL注入攻击的关键部分。
答案 1 :(得分:2)
是的,这仍然可以保护您免受SQL注入。
您没有在.NET代码中动态构建SQL字符串,并且您没有使用sp_execute在存储过程中动态构建和执行SQL语句。
答案 2 :(得分:0)
DbType
的默认SQLParameter
为NVarChar
(根据docs),因此这是您的参数所具有的类型。
无论如何,即使参数类型错误,你最糟糕的事情就是类型转换异常,而不是SQL
注入。
答案 3 :(得分:0)
我仍然建议使用输入参数。 虽然实现捕获任何注射尝试AS FOR NOW,但没有真正的保证,这将是下线 - 并希望您的应用程序将导致漫长而繁荣的生命... =)
关于SQL Server,可以在此处找到有关该主题的MSDN文章: http://msdn.microsoft.com/en-us/library/ff648339.aspx