防止存储过程中的SQL注入

时间:2017-05-22 19:31:43

标签: sql-server sql-injection

我想阻止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 ”。他删除了我们所有的角色。 (备份ftw)但是一次又一次地恢复备份真的很烦人。并且不要忘记这个小回滚。 smp对我来说似乎很好。是的,我是初学者,对我这么羞耻:*。谢谢你的帮助。

for row in ws['E5:E91']:
    for cell in row:
       cell.value = "=VLOOKUP(D{0}, 'POD data'!C1:D87, 2, FALSE)".format(cell.row)

1 个答案:

答案 0 :(得分:1)

我认为对于理解SQL注入的人来说,答案是显而易见的:不要将EXEC不可信的输入作为SQL语句!

我不知道你的_)$*%R前缀的用途是什么。它似乎是一种"后门"允许执行逐字SQL语句?你为什么要这样做?这是一种默默无闻的安全措施吗?攻击者可能通过在浏览器中查看您的网页源来找到前缀。

如果此程序是为了更新公会通知,那么只需进行第二次更新并删除后门代码。

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