¡La función que estás buscando es QUOTENAME
!
Mediante el uso práctico de la tecnología de corchetes, puede encapsular cadenas de forma segura para ayudar en la prevención de ataques de inyección SQL en caliente.
Tenga en cuenta que el simple hecho de poner corchetes alrededor de algo no lo cita con seguridad, aunque puede evitar que su código se equivoque con caracteres no válidos en los nombres de los objetos.
Buen código
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
Código malo
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
Para dar un ejemplo específico ...
Lo siguiente funciona bien para la entrada inicial
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
Pero con entrada maliciosa es vulnerable a la inyección 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);
El uso QUOTENAME
se escapa correctamente de la incrustación ]
y evita que ocurra el intento de inyección 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);
Nombre de objeto no válido 'sysobjects]; SELECT' Este es un código arbitrario ejecutado. Podría haber caído una tabla o otorgado permisos '-'.