当前位置:  开发笔记 > 数据库 > 正文

SQL Server:针对注入攻击消除@param

如何解决《SQLServer:针对注入攻击消除@param》经验,为你挑选了1个好方法。

为了论证,我们只想说我必须创建一个包含具有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的值不会使@插入值成为恶意或格式错误,因为它是对EXEC的查询.

这让我们想到了一个问题:在@message中的'字符是否已经足够了?是否有任何其他字符可以出现在@message中可以逃脱?

例:

 DECLARE @insert NVARCHAR(MAX)
 SELECT @message = REPLACE(@message,'''','''''')
 SELECT @insert = 
  'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
 EXEC (@insert)  

(当我说" 必须 "时,这是因为我的查询是在一个存储过程中,并且这个存储过程接受@table,这是要插入的目标表.我对讨论我的架构或为什么表不感兴趣通过过程参数"动态"指定INSERT到.请不要对此进行评论,除非EXEC()查询指定一个表进入INSERT,然后再接收表名作为过程参数.)



1> Mitch Wheat..:

使用sp_executesql和内置quotename().本文,动态SQL的诅咒和祝福,几乎是权威的参考.

推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有