参数化存储过程中的SQL注入

时间:2014-05-04 07:39:28

标签: stored-procedures sql-injection parameterized

我有一个存储过程:

USE AdventureWorks2012;
GO
CREATE PROCEDURE HumanResources.uspGetEmployeesTest2 
    @LastName nvarchar(50), 
    @FirstName nvarchar(50) 
AS 
    SET NOCOUNT ON;

    SELECT 
        FirstName, LastName, Department
    FROM 
        HumanResources.vEmployeeDepartmentHistory
    WHERE 
        FirstName = @FirstName AND LastName = @LastName
        AND EndDate IS NULL;
GO

如果我提供@LastName = '' OR '1' = '1' --''

,它将导致SQL注入

我是SQL注入的新手。我需要一些关于如何保护它的建议

1 个答案:

答案 0 :(得分:2)

您是否有一个包含参数化语句的存储过程是至关重要的区别:

CREATE PROCEDURE Proc @Param NVARCHAR(50) AS
    SELECT * FROM Table WHERE Col = @Param;
GO

或者以字符串形式动态构建语句的存储过程:

CREATE PROCEDURE Proc @Param NVARCHAR(50) AS
    DECLARE @Query AS NVARCHAR(500)
    SET @Query = 'SELECT * FROM Table WHERE Col = ''' + @Param + '''';
    EXEC @Query;
GO

使用以前的存储过程,数据参数可以清楚地与代码区分开来。

但是,对于后一个存储过程,@Param的值将合并到生成的SQL代码中:

SELECT * FROM Table WHERE Col = '<value of @Param>'

如果@Param的值格式不正确,它可能会过早地结束字符串文字,并且参数值的某些部分可能不会被解释为预期的,i。例如,不是一个字符串。