A função que você está procurando é QUOTENAME
!
Através do uso prático da tecnologia de colchete, você pode encapsular com segurança seqüências de caracteres para ajudar na prevenção de ataques de injeção de SQL quentes.
Observe que apenas colocar colchetes em torno de algo não é citado com segurança, embora você possa evitar erros de código com caracteres inválidos nos nomes de objetos.
Good code
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
Código incorreto
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
Para dar um exemplo específico ...
O seguinte funciona bem para a entrada inicial
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
Mas com entrada maliciosa, é vulnerável à injeção de SQL
DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
O uso QUOTENAME
escapa corretamente do incorporado ]
e impede a tentativa de injeção de SQL.
DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM ' + QUOTENAME(@ObjectName);
EXEC (@dynSql);
Nome de objeto inválido 'sysobjects]; SELECT' Este é um código arbitrário executado. Pode ter descartado uma tabela ou concedido permissões '-'.