SQL Server:针对注入攻击消除@param
发布时间:2020-12-12 06:58:50 所属栏目:MsSql教程 来源:网络整理
导读:为了论证,我们只想说我必须创建一个包含具有INSERT的SQL查询的局部变量: DECLARE @insert NVARCHAR(MAX) SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES... EXEC (@insert) 此INSERT还将包含列值: DECLARE @insert NVARCHAR(MAX) SELECT @in
为了论证,我们只想说我必须创建一个包含具有INSERT的SQL查询的局部变量:
DECLARE @insert NVARCHAR(MAX) SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES... EXEC (@insert) 此INSERT还将包含列值: DECLARE @insert NVARCHAR(MAX) SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')' EXEC (@insert) 现在,我显然关注注入攻击,并希望确保@ message的值不会使@ insert的值恶意或格式错误作为对EXEC的查询. 这给我们带来了一个问题:逃避@message中的’字符是否足够?是否有任何其他可能出现在@message中的角色可以逃脱? 例: DECLARE @insert NVARCHAR(MAX) SELECT @message = REPLACE(@message,'''','''''') SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')' EXEC (@insert) (当我说“必须”时,这是因为我的查询是在一个存储过程中,并且这个存储过程接受@table,这是INSERT的目标表.我对讨论我的架构或为什么表不感兴趣通过过程参数“动态”指定INSERT到.请不要对此进行评论,除非EXEC()查询之外还有另一种方法来指定要插入的表,然后将表名作为过程参数接收.) 解决方法使用sp_executesql和内置的引号().这篇文章,The Curse and Blessings of Dynamic SQL,几乎是最权威的参考.(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |