Désolé pour la longue question, mais celle-ci contient tout le SQL que j'ai utilisé pour tester le scénario afin d'éclaircir ce que je fais.SQL Server - Table dynamique PIVOT - Injection SQL
Je suis construire une SQL dynamique pour produire un tableau croisé dynamique dans SQL Server 2005.
est le code ci-dessous pour le faire. Avec diverses sélections montrant les données brutes les valeurs en utilisant GROUP BY et les valeurs dans un PIVOT comme je les veux.
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
Chaque fois que je produis un SQL dynamique, je suis toujours au courant des attaques par injection SQL. J'ai donc ajouté la ligne suivante avec les autres instructions INSERT.
INSERT INTO #PivotTest (ColumnA, ColumnB, ColumnC) VALUES('A', 'FOO])) PVT; DROP TABLE #PivotTest;SELECT ((GETDATE()--', 1)
Quand je lance maintenant le SQL, faible et voici, la partie EXEC supprime la table #PivotTest rendant ainsi la dernière SELECT échouer. Donc, ma question est, est-ce que quelqu'un connaît un moyen d'effectuer un PIVOT dynamique sans risquer des attaques par injection SQL?
1) Mon échantillon de test est simple. Les colonnes réelles sont nvarchar (max). Nous n'avons pas de données de cette taille à l'heure actuelle et les données qui seraient utilisées pour le PIVOT seraient rarement autant que 100 donc je peux effectuer une troncature forcée dans ce cas! Bonne idée. 2) Je pensais aux '[' et ']'. Je suis tenté de supprimer tous les crochets des données et de limiter cela à cette fonctionnalité. 3) Les seules personnes pouvant ajouter ces données sont les "super-utilisateurs", mais cela ne me suffit pas pour avoir l'esprit tranquille. –
QUOTENAME! La première fois que je l'ai vu! Parfait! Cela résout complètement le problème. J'ajoutais les CITATIONS manuellement.Si je supprime ceci et le fais en utilisant QUOTENAME cela désactivera tout SQL dans ce champ! JE VOUS REMERCIE! –