举个例子,假设我必须创建一个包含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参数,这个参数是要插入的目标表名。我不想讨论我的架构或者为什么要通过过程参数“动态”指定要插入的表名。请勿评论此事,除非有其他方法可以指定要插入的表名而不是通过执行查询获得过程参数接收的表名。