Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server - Tableau PIVOT dynamique - Injection SQL

Nous avons fait beaucoup de travail similaire à votre exemple. Nous ne nous sommes pas inquiétés de l'injonction SQL, en partie parce que nous avons un contrôle complet et total sur les données en cours de pivotement :il est tout simplement impossible qu'un code malveillant puisse passer par ETL dans notre entrepôt de données.

Quelques réflexions et conseils :

  • Êtes-vous obligé de pivoter avec des colonnes nvarcahr(500) ? Les nôtres sont varchar(25) ou numériques, et il serait assez difficile d'y glisser du code dommageable.
  • Qu'en est-il de la vérification des données ? Il semble que si l'une de ces chaînes contenait un caractère "]", c'est soit une tentative de piratage, soit des données qui exploseront de toute façon.
  • Quelle est la robustesse de votre sécurité ? Le système est-il verrouillé de manière à ce que Malorey ne puisse pas se faufiler dans votre base de données (soit directement, soit via votre application) ?

Ha. Il a fallu écrire tout cela pour se souvenir de la fonction QUOTENAME(). Un test rapide semblerait indiquer que l'ajouter à votre code comme cela fonctionnerait (vous obtiendrez une erreur, pas une table temporaire abandonnée) :

SELECT
        @columns = 
        STUFF
        (
                (
                        SELECT DISTINCT
                                ', [' + quotename(ColumnB, ']') + ']'
                        FROM
                                #PivotTest
                        FOR XML PATH('')
                ), 1, 1, ''
        )

Cela devrait fonctionner pour les situations de pivot (et non pivot), puisque vous devez presque toujours [mettre entre parenthèses] vos valeurs.