gpt4 book ai didi

SQL Server : Sanitizing @param against injection attacks

转载 作者:行者123 更新时间:2023-12-02 15:27:07 25 4
gpt4 key购买 nike

为了便于讨论,我们假设我必须创建一个包含具有 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)

现在,我显然担心注入(inject)攻击,并希望确保 @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,这是要插入的目标表。我没有兴趣讨论我的体系结构或为什么要插入的表是通过过程参数“动态”指定的。请不要对此发表评论,除非除了 EXEC() 查询之外还有另一种方法来指定要插入的表然后表名作为过程参数被接收。)

最佳答案

使用sp_executesql和内置quotename()。这篇文章,The Curse and Blessings of Dynamic SQL ,几乎是权威的引用。

关于SQL Server : Sanitizing @param against injection attacks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/703856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com