为了争论,假设我必须创建一个包含 SQL 查询的局部变量,该查询具有 INSERT:
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 into 是通过过程参数“动态”指定的。请不要对此发表评论,除非除了 EXEC() 查询之外还有另一种方法来指定要插入的表,然后将表名作为过程参数接收。)