Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server - Tabela Dinâmica PIVOT - SQL Injection


Fizemos muito trabalho semelhante ao seu exemplo. Não nos preocupamos com a injeção de SQL, em parte porque temos controle total e completo sobre os dados que estão sendo dinamizados - simplesmente não há como códigos maliciosos passarem por ETL para nosso data warehouse.

Alguns pensamentos e conselhos:
  • Você precisa dinamizar com colunas nvarcahr(500)? Os nossos são varchar(25) ou numéricos, e seria muito difícil inserir códigos prejudiciais por lá.
  • Que tal verificar os dados? Parece que se uma dessas strings contivesse um caractere "]", é uma tentativa de hack ou dados que explodirão em você de qualquer maneira.
  • Quão robusta é a sua segurança? O sistema está bloqueado de forma que Malorey não possa infiltrar seus hacks em seu banco de dados (diretamente ou por meio de seu aplicativo)?

Ah. Foi preciso escrever tudo isso para lembrar a função QUOTENAME(). Um teste rápido parece indicar que adicioná-lo ao seu código assim funcionaria (você receberá um erro, não uma tabela temporária descartada):
SELECT
        @columns = 
        STUFF
        (
                (
                        SELECT DISTINCT
                                ', [' + quotename(ColumnB, ']') + ']'
                        FROM
                                #PivotTest
                        FOR XML PATH('')
                ), 1, 1, ''
        )

Isso deve funcionar para situações de pivô (e não pivô), já que você quase sempre precisa colocar entre parênteses seus valores.