Функция, которую вы ищете, это QUOTENAME
!
Благодаря практическому использованию технологии квадратных скобок, вы можете безопасно инкапсулировать строки, чтобы помочь предотвратить атаки с использованием горячих SQL-инъекций.
Обратите внимание , что только торчащие квадратные скобки вокруг чего - то никак не безопасно цитировать его, хотя вы можете избежать кода erroring с недопустимыми символами в именах объектов.
Хороший код
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
Плохой код
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
Чтобы привести конкретный пример ...
Следующее отлично работает для начального ввода
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
Но со злонамеренным вводом это уязвимо для инъекции 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);
QUOTENAME
Правильное использование экранирует встроенное ]
и предотвращает попытки внедрения 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);
Неверное имя объекта 'sysobjects]; SELECT' Это какой-то произвольный исполняемый код. Возможно, он отбросил таблицу или получил разрешения «-».