这个 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
否,动态 SQL 无法参数化。参数只能用于替换 SQL 查询中的值,不能用于替换列或其他对象名称。
我需要使用 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
否,动态 SQL 无法参数化。参数只能用于替换 SQL 查询中的值,不能用于替换列或其他对象名称。