可以参数化此SQL数据透视查询以避免SQL注入吗?

时间:2018-01-10 16:23:46

标签: sql-server tsql pivot 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 个答案:

答案 0 :(得分:1)

不,动态SQL无法参数化。参数只能用于替换SQL查询中的值,而不能替换列或其他对象名称。