我有一个存储过程:
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注入的新手。我需要一些关于如何保护它的建议
答案 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。例如,不是一个字符串。