簡體   English   中英

如何在插入記錄時使用存儲過程阻止SQL注入?

[英]How to prevent SQL injection using a stored procedure while insert record?

我是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查詢,該查詢通過字符串連接構建並動態執行。 它幾乎總是以下形式:

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

對於這個特定的存儲過程,攻擊者可以做的最糟糕的事情是將無用的值插入到tblParamTable中

但是 ,如果稍后在動態構建的查詢中使用這些值,那么這僅僅會成為二階攻擊:在第1頁上插入值,請參閱第2頁上的動態查詢結果。(我只提到這個,因為你的表被命名為tblParamTable,建議它可能包含以供以后重用的參數。)

我可以阻止SQL注入嗎?

你已經 - 因為你正在使用參數,所以沒有辦法將代碼“注入”你的SQL語句。

這是正確的方法嗎?

嗯,沒有一種“正確”的方式 - 但我沒有看到你正在做的事情有什么嚴重錯誤。 一些建議

  • 您不需要RETURN輸出參數值。 設置就足夠了。
  • 你有BEGIN / END塊之外的最后一個SELECT ,它不會傷害任何東西,但為了保持一致性,你應該把所有東西放在BEGIN / END (或者完全不讓它們)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM