Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止在插入记录时使用存储过程进行SQL注入?_C#_Asp.net_Sql_Sql Server 2005 - Fatal编程技术网

C# 如何防止在插入记录时使用存储过程进行SQL注入?

C# 如何防止在插入记录时使用存储过程进行SQL注入?,c#,asp.net,sql,sql-server-2005,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

我是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注入吗

您已经做到了,因为您使用的是参数,所以无法将代码“注入”到SQL语句中

这条路对吗

嗯,没有一个“正确”的方法——但我看不出你所做的有什么严重的错误。一些建议:

  • 您不需要
    返回输出参数值。设置它就足够了
  • 您在
    开始
    /
    结束
    块之外有最后一个
    选择
    ,这不会损害任何东西,但为了保持一致性,您应该将所有内容都放在
    开始
    /
    结束
    (或将它们全部删除)

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

@dynamicSQL = "select * from sensitivetable where field = " + @injectableParameter
sp_executesql @dynamicSQL
对于这个特定的存储过程,攻击者所能做的最糟糕的事情就是在tblParamTable中插入无用的值


但是如果这些值随后在动态生成的查询中使用,那么这只会成为二级攻击:在第1页插入值,请参见第2页的动态查询结果。(我之所以提到这一点,是因为您的表名为tblParamTable,这表明它可能包含参数供以后重用。)

据我所知,SQL注入攻击是从UI(网页)发生的。为了防止sql注入攻击,您需要对网页中的输入字段进行验证。@MSRS不幸的是,错误数据,例如sql注入,可能来自许多地方,包括用户、数据库字段和配置文件。正确的解决方案是使用参数化查询,这样就不会直接执行字符串。只要您没有在存储过程中做一些奇怪的事情,比如构建动态SQL并在其上使用
EXECUTE
,或者构建包含用户输入并运行xp\u cmdshell的系统命令,您存储的进程应该很好。然而,正如@rob所说,您必须使用参数化查询调用存储的proc;如果您构建自己的
“EXECUTE spInsertParamTable@CmpyCode=”+userInput+…
并执行,那么这将不会保存您,因为它将是可SQLI的。请确保使用正确的
IDbParameter
将参数传递到您的存储过程中。还应仅授予执行权限,以便您的应用程序级用户只能调用存储过程,而不能调用其他任何操作。从技术上讲,这是不正确的。它是关于如何调用存储过程的:如果
EXECUTE
命令是通过与用户输入(传递参数)而不是参数对象的字符串连接而生成的,那么调用它的是存储过程而不是sql语句这一事实将不会从SQLI保存。