如何在插入记录时使用存储过程阻止SQL注入?

时间:2014-05-01 15:31:41

标签: c# asp.net sql sql-server-2005

我是SQL Server新手,我试图使用存储过程将记录插入表中,如下所示。

我想要一个使用以下存储过程的建议。也:

  • 我可以阻止SQL注入吗?
  • 这是正确的方法吗?

如果我错过了导致SQL注入的以下过程中的任何内容,请更正我。

Create PROCEDURE [dbo].[spInsertParamTable]
   @CmpyCode nvarchar(50),
   @Code nvarchar(50),
   @DisplayCode nvarchar(50),
   @TotalDigit int,
   @Nos bigint,
   @IdentitY int OUTPUT
AS
BEGIN
   INSERT tblParamTable (CmpyCode, Code, DisplayCode, TotalDigit, Nos)
   VALUES (@CmpyCode, @Code, @DisplayCode, @TotalDigit, @Nos)
END

SELECT @Identity = SCOPE_IDENTITY();
RETURN @Identity

2 个答案:

答案 0 :(得分:7)

SQL注入专门指将SQL代码注入到通过字符串连接构建并动态执行的现有SQL查询中。它几乎总是以下形式出现:

@dynamicSQL = "select * from sensitivetable where field = " + @injectableParameter
sp_executesql @dynamicSQL

对于此特定存储过程,攻击者可以做的最糟糕的事情是将无用的值插入 tblParamTable

但是,如果稍后在动态构建的查询中使用这些值,那么这只会成为二阶攻击:在第1页插入值,请参阅页面上的动态查询结果2.(我只提到这个,因为你的表名为tblParamTable,表明它可能包含参数供以后重复使用。)

答案 1 :(得分:1)

  

我可以阻止SQL注入吗?

你已经 - 没有办法注射"因为您正在使用参数,所以将代码编入您的SQL语句。

  

这是正确的方法吗?

嗯,没有一个"对"方式 - 但我没有看到你正在做的事情有什么严重错误。一些建议

  • 您不需要RETURN输出参数值。设置就足够了。
  • 您有SELECT / BEGIN块之外的最后一个END,它不会伤害任何东西,但为了保持一致性,您应该放置所有内容在BEGIN / END内(或完全不让它们)。