Ви шукаєте функцію QUOTENAME
!
Завдяки практичному використанню технології квадратних дужок, ви можете сміливо інкапсулювати струни, щоб допомогти у запобіганні гарячих атак ін'єкцій SQL.
Зауважте, що просто наклеювати квадратні дужки навколо чогось не цитувати це безпечно, хоча ви можете уникнути помилок коду з недійсними символами в іменах об'єктів.
Хороший код
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' Це якийсь довільний код, виконаний. Можливо, вона скинула таблицю або надала дозволи "-".