Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server – Dynamische PIVOT-Tabelle – SQL-Injection

Wir haben viele ähnliche Arbeiten wie in Ihrem Beispiel durchgeführt. Wir haben uns keine Gedanken über SQL-Einschleusung gemacht, zum Teil, weil wir die vollständige und vollständige Kontrolle über die zu pivotierenden Daten haben – es gibt einfach keine Möglichkeit, dass bösartiger Code durch ETL in unser Data Warehouse gelangt.

Einige Gedanken und Ratschläge:

  • Müssen Sie mit nvarcahr(500)-Spalten pivotieren? Unsere sind varchar(25) oder Zahlen, und es wäre ziemlich schwierig, dort schädlichen Code einzuschleusen.
  • Wie sieht es mit der Datenprüfung aus? Wenn einer dieser Strings ein "]"-Zeichen enthielt, handelt es sich anscheinend entweder um einen Hack-Versuch oder um Daten, die Sie sowieso in die Luft jagen werden.
  • Wie robust ist Ihre Sicherheit? Ist das System so gesperrt, dass Malorey seine Hacks nicht in Ihre Datenbank einschleusen kann (entweder direkt oder über Ihre Anwendung)?

Ha. All das musste geschrieben werden, um sich an die Funktion QUOTENAME() zu erinnern. Ein schneller Test scheint darauf hinzudeuten, dass das Hinzufügen zu Ihrem Code so funktionieren würde (Sie erhalten eine Fehlermeldung, keine gelöschte temporäre Tabelle):

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

Dies sollte für Pivot- (und Unpivot-) Situationen funktionieren, da Sie Ihre Werte fast immer in [Klammern] setzen müssen.