我是SQL Server新手,我试图使用存储过程将记录插入表中,如下所示。
我想要一个使用以下存储过程的建议。也:
如果我错过了导致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
答案 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
内(或完全不让它们)。