Aradığınız fonksiyon QUOTENAME
!
Köşeli parantez teknolojisinin pratik kullanımı sayesinde, sıcak SQL enjeksiyon saldırılarının önlenmesine yardımcı olmak için dizeleri güvenli bir şekilde kapsülleyebilirsiniz.
Nesnelerin adlarında geçersiz karakterlerle kod hatalarınızı önleyebilmenize rağmen, bir şeyin etrafına köşeli parantez yapıştırmanın güvenli bir şekilde teklif etmediğini unutmayın .
İyi kod
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
Hatalı kod
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
Belirli bir örnek vermek gerekirse ...
İlk giriş için aşağıdakiler iyi çalışır
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
Ancak kötü niyetli girdi ile SQL enjeksiyonuna karşı savunmasızdır
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
Doğru bir şekilde kullanılması gömülü öğeden kaçar ]
ve denenen SQL enjeksiyonunun gerçekleşmesini önler.
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);
Geçersiz nesne adı 'sysobjects]; SELECT' Bu, yürütülen rastgele bir koddur. Bir tabloyu düşürmüş veya '-' izinleri almış olabilir.