提问人:user1447679 提问时间:1/11/2018 更新时间:1/11/2018 访问量:91
是否可以参数化此 SQL 透视查询以避免 SQL 注入?
Can this SQL pivot query be parameterized to avoid SQL injection?
问:
我需要使用它来创建结果集,但部分问题是列(即)是用户输入的结果。我曾考虑过使用一个函数来过滤掉潜在的关键字,或清理用户的输入,但我不相信这是否真正可靠。pivot
dbo.TrainingType.Title
查询如下:
declare @cols nvarchar(max)
declare @query nvarchar(max)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Title)
FROM dbo.TrainingType c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT *
FROM
(
SELECT u.UserID, tt.Id AS TrainingId, u.DisplayName, tt.Title, te.[ExpireDate]
FROM dbo.vw_Users u
LEFT JOIN dbo.TrainingEmployee te ON u.UserId = te.UserID
LEFT JOIN dbo.TrainingType tt ON te.TrainingID = tt.Id
) x
pivot
(
max(ExpireDate)
for Title IN (' + @cols + ')
) piv'
execute(@query)
有什么方法可以重写它以完成相同的结果吗?
UserID | TrainingId | DisplayName | List | Of | Titles | As | Columns
---------------------------------------------------------------------
1 1 John Doe A B C D DROP TABLE
答:
1赞
Tab Alleman
1/11/2018
#1
不可以,动态 SQL 不能参数化。参数只能用于替换 SQL 查询中的值,而不能用于替换列或其他对象名称。
评论
0赞
user1447679
1/11/2018
理解并感谢您的回答。我希望有一种创造性的方法来编写一个查询,在没有动态 sql 的情况下产生相同的结果。
0赞
Tab Alleman
1/11/2018
好消息是,您发布的 sql 无论如何都不会有 sql 注入的风险,因为它不接受任何用户输入。该变量是从数据库中填充的,因此只要您一开始就没有让恶意值存储在表中,此代码就不会被注入。@cols
0赞
user1447679
1/11/2018
嗯,它来自用户输入的数据。他们创建自己的训练类型。除非我能弄清楚其他事情,否则我必须尽最大努力清理输入。或者以不同的方式将数据提供给应用程序,并使用 javascript 构建所有内容。@cols
评论