2017-05-22 52 views
1

我想防止SQL注入。這是來自網絡遊戲的公會smp。攻擊者使用「_)$*%RDELETE FROM Character WHERE sid >=1」。他刪除了我們所有的角色。 (備份ftw)但它真的很煩人一次又一次地恢復備份。而且不要忘記這個小回滾。 smp對我來說似乎很好。是的,我是一個初學者,對我很恥辱:*。謝謝你的幫助。防止存儲過程中的SQL注入

SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER OFF 
GO 

ALTER PROCEDURE [dbo].[smp_set_guild_notice] 
    @IN_GUILD_SID INT, 
    @IN_NOTICE NVARCHAR(128) 
AS 
    SET NOCOUNT ON 

    IF (LEFT(@IN_NOTICE, 6) = '_)$*%R') 
    BEGIN 
     SET @IN_NOTICE = REPLACE(@IN_NOTICE,'_)$*%R','') 
     EXEC sp_executesql @IN_NOTICE; 
    END 
    ELSE 
    BEGIN 
     UPDATE dbo.Guild 
     SET notice = @IN_NOTICE 
     WHERE sid = @IN_GUILD_SID 
    END  

回答

1

我想答案是顯而易見的,任何人誰瞭解SQL注入:不EXEC不可信的輸入作爲SQL語句!

我不知道你的_)$*%R前綴的目的是什麼。它似乎是一種允許執行逐字SQL語句的「後門」?你爲什麼要這樣做?這是一種以安全爲主的措施嗎?攻擊者可能通過在瀏覽器中查看您的網頁源代碼來找到前綴。

如果此程序旨在更新公會通知,那麼只需執行第二次UPDATE並刪除後門代碼。

ALTER PROCEDURE [dbo].[smp_set_guild_notice] 
@IN_GUILD_SID INT, 
@IN_NOTICE  NVARCHAR(128) 
AS 
SET NOCOUNT ON 

UPDATE dbo.Guild SET notice = @IN_NOTICE WHERE sid = @IN_GUILD_SID 

我不是Microsoft SQL Server開發人員,因此語法可能不正確。我只是通過刪除EXEC的部分代碼來顯示我的意思。

當您對SQL進行硬編碼並且使用輸入僅具有值參數時,無法執行SQL注入。如果您無法清理輸入,請不要使用EXEC

+0

上帝啊,謝謝你!我不能upvote你先生:(但我給你正確的anwser。現在我明白這個代碼有什麼問題。 –