我想阻止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)
答案 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
。