Яка функція цитує ідентифікатор в динамическом sql з SQL Server?


11

Що таке метод SQL Server безпечного котирування ідентифікаторів для генерації динамічного sql.

Як я можу переконатися, що для динамічно згенерованого оператора дається ім’я, що динамічно генерується, що сам стовпець не є атакою ін'єкції SQL.

Скажімо, у мене є заява SQL,

SELECT [$col] FROM table;

що по суті те саме, що

'SELECT [' + $col + '] FROM table;'

Що зупиняє ін'єкційну атаку де

$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";

У результаті

SELECT [name] FROM sys.objects;
DROP TABLE my.accounts;
-- ] FROM table;

Відповіді:


14

Ви шукаєте функцію 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' Це якийсь довільний код, виконаний. Можливо, вона скинула таблицю або надала дозволи "-".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.