【问题标题】:How to prevent SQL injection using a stored procedure while insert record?如何在插入记录时使用存储过程防止 SQL 注入?
【发布时间】:2014-06-18 02:56:01
【问题描述】:

我是 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

【问题讨论】:

  • 据我所知,SQL 注入攻击发生在 UI(网页)。为了防止 sql 注入攻击,您需要对放置在网页中的输入字段进行验证。
  • @MSRS 不幸的是错误的数据 e.i. SQL 注入可以来自很多地方,包括用户、数据库字段、配置文件。正确的解决方案是使用参数化查询,这样就不会直接执行字符串。
  • 只要您不在存储过程中做奇怪的事情,例如构建动态 SQL 并在其上使用 EXECUTE,或者构建包含用户输入的系统命令并使用它运行 xp_cmdshell,您的存储过程应该没问题。但是,正如@rob 所说,您必须使用参数化查询调用存储过程;如果您构建自己的"EXECUTE spInsertParamTable @CmpyCode='"+userInput+... 并执行,那么这不会拯救您,因为它将支持 SQLI。请务必使用正确的IDbParameter 将参数传递到您的存储过程中。
  • 也只授予执行权限,因此您的应用程序级用户只能调用存储过程而不能调用其他任何内容。

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


【解决方案1】:

我可以防止 SQL 注入吗?

您已经是 - 由于您使用参数,因此无法将代码“注入”到您的 SQL 语句中。

这是正确的方法吗?

嗯,没有一种“正确”的方式 - 但我认为你的做法没有任何严重错误。一些建议

  • 你不需要RETURN你的输出参数值。设置就够了。
  • 你在BEGIN/END 块之外有最后一个SELECT,这并没有伤害,但为了保持一致性,你应该将所有内容都放在BEGIN/END 中(或完全忽略它们)。

【讨论】:

  • 技术上这是不正确的。它是关于如何调用存储过程的:如果EXECUTE 命令是通过字符串连接与用户输入(传递参数)而不是参数对象构建的,那么它是一个存储过程而不是 sql 语句的事实被调用将不会保存来自 SQLI。
【解决方案2】:

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

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

对于这个特定的存储过程,攻击者可以做的最糟糕的事情就是将无用的值插入到您的 tblParamTable 中。

然而,如果这些值随后被用于动态构建的查询中,那么这只是一种二阶攻击:在第 1 页插入值,在页面上查看动态查询的结果2.(我只提到这个,因为你的表被命名为 tblParamTable,暗示它可能包含供以后重用的参数。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    相关资源
    最近更新 更多