對不起,但這包含了我用來測試場景的所有SQL,希望能夠讓我清楚自己在做什麼。SQL Server - 動態PIVOT表 - SQL注入
我建立一些動態SQL產生透視表在SQL Server 2005
下面的代碼來做到這一點。用各種選擇顯示原始數據使用GROUP BY的值和PIVOT中的值,因爲我想要它們。
BEGIN TRAN
--Create the table
CREATE TABLE #PivotTest
(
ColumnA nvarchar(500),
ColumnB nvarchar(500),
ColumnC int
)
--Populate the data
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'X', 1)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'Y', 2)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'Z', 3)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'X', 4)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'Y', 5)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('B', 'Z', 6)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('B', 'X', 7)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('B', 'Y', 8)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('B', 'Z', 9)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('C', 'X', 10)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('C', 'Y', 11)
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('C', 'Z', 12)
--The data
SELECT * FROM #PivotTest
--Group BY
SELECT
ColumnA,
ColumnB,
SUM(ColumnC)
FROM
#PivotTest
GROUP BY
ColumnA,
ColumnB
--Manual PIVOT
SELECT
*
FROM
(
SELECT
ColumnA,
ColumnB,
ColumnC
FROM
#PivotTest
) DATA
PIVOT
(
SUM(DATA.ColumnC)
FOR
ColumnB
IN
(
[X],[Y],[Z]
)
) PVT
--Dynamic PIVOT
DECLARE @columns nvarchar(max)
SELECT
@columns =
STUFF
(
(
SELECT DISTINCT
', [' + ColumnB + ']'
FROM
#PivotTest
FOR XML PATH('')
), 1, 1, ''
)
EXEC
('
SELECT
*
FROM
(
SELECT
ColumnA,
ColumnB,
ColumnC
FROM
#PivotTest
) DATA
PIVOT
(
SUM(DATA.ColumnC)
FOR
ColumnB
IN
(
' + @columns + '
)
) PVT
')
--The data again
SELECT * FROM #PivotTest
ROLLBACK
任何時候,我產生任何動態SQL我總是知道SQL注入攻擊。因此,我在其他INSERT語句中添加了以下行。
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'FOO])) PVT; DROP TABLE #PivotTest;SELECT ((GETDATE()--', 1)
當我現在運行SQL,低不料,EXEC部分下降從而#PivotTest表進行最後的SELECT失敗。
所以我的問題是,有誰知道一種方法來執行動態PIVOT而不冒着SQL注入攻擊風險?
1)我的測試樣品是一個簡單的。實際的列是nvarchar(max)。目前我們沒有數據大小的數據,而用於PIVOT的數據很少會達到100個,所以我可以在這種情況下執行強制截斷!好想法。 2)我正在考慮'['和']'。我很想從數據中去掉所有的方括號,並將其作爲此功能的限制。 3)唯一能夠添加這些數據的人稱爲「超級用戶」,但這不足以讓我安心。 – 2009-09-17 16:37:05
QUOTENAME!我第一次看到它!完善!這完全解決了這個問題。我手動添加QUOTES。如果我刪除它並使用QUOTENAME執行它,它將禁用該字段中的任何SQL!謝謝! – 2009-09-17 16:38:22