【问题标题】:SQL injection in parametrized stored procedure参数化存储过程中的 SQL 注入
【发布时间】:2014-06-20 15:40:13
【问题描述】:

我有一个存储过程:

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 注入的新手。我需要一些关于如何保护它的建议

【问题讨论】:

  • 不,它不会容易受到 SQL 注入的影响 - 它只会搜索那个姓氏的人(而且很可能找不到任何人)... 仅限 SQL 注入当您在自己的代码中将 SQL 语句和用户输入连接在一起时会发生
  • 如果查询是“select *”,那么用户可以看到所有的信息(他不会被允许。他将被允许看到基于where子句的信息)。这不是安全下降吗??
  • 对不起 - 我不明白你在问什么....这段代码中没有 SELECT * ,并且 @LAstName 的值不会突然出现 @987654325 @ 要么......
  • 好的,让我说清楚。如果有类似 SELECT * from ..... where FirstName = parameterOfFirtName AND LastName = parameterOfLastName ... 和 parameterOfFirtName 的值将是 '' OR '1' = '1' --'' 。在这种情况下,无论 where 子句如何,用户都可能看到所有信息。我在问我是否也应该意识到这一点。
  • 不,只要您使用参数化查询(如您所做的那样),您就是安全的。没有 SQL 注入。只有当您自己从 SQL 片段和用户输入构建 SQL 语句并且您在不使用参数的情况下将其混合时,才会发生 SQL 注入

标签: stored-procedures sql-injection parameterized


【解决方案1】:

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

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 的值格式不正确,它可能会提前结束字符串字面量,并且部分参数值可能无法按预期解释,即。例如,不是字符串。

【讨论】:

  • 感谢您的回复。但是我没有明白“数据参数与代码清楚地区分”是什么意思。对于第一个程序。你能解释一下吗?
  • @YeasinAbedinSiam 与第二种情况相反,该变量不会被插值并替换为它的值。解析器实际上将@Param 识别为变量,并且仅在执行时使用它的值。看看Bill Karwin’s presentation Sql Injection Myths and Fallacies,幻灯片 47 和以下内容。
  • 哦..现在我明白了..非常感谢! :)
猜你喜欢
  • 2013-05-03
  • 2018-10-06
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多