La funzione che stai cercando è QUOTENAME
!
Attraverso l'uso pratico della tecnologia a parentesi quadra, è possibile incapsulare in modo sicuro stringhe per aiutare a prevenire attacchi di iniezione SQL caldi.
Tieni presente che il fatto di incollare parentesi quadre attorno a qualcosa non lo cita in modo sicuro, anche se puoi evitare errori di codice con caratteri non validi nei nomi degli oggetti.
Buon codice
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
Codice errato
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
Per fare un esempio specifico ...
Di seguito funziona bene per l'input iniziale
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
Ma con input dannosi è vulnerabile all'iniezione 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);
L'uso QUOTENAME
corretto evita l'incorporamento ]
e impedisce che si verifichi il tentativo di iniezione 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 oggetto non valido 'sysobjects]; SELECT' Questo è un codice arbitrario eseguito. Potrebbe aver eliminato una tabella o concesso autorizzazioni "-".