Hangi işlev SQL Server ile dinamik sql bir tanımlayıcı tırnak?


11

Dinamik sql üretimi için güvenli tırnak tanımlayıcılarının SQL Server yöntemi nedir.

Dinamik olarak oluşturulmuş bir ifade için sütunun kendisinin bir SQL enjeksiyon saldırısı olmadığını dinamik olarak oluşturulmuş bir sütun adı verildiğinden nasıl emin olabilirim.

Diyelim ki bir SQL Bildirimim var,

SELECT [$col] FROM table;

ki esasen aynı

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

Bir enjeksiyon saldırısını durduran

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

Sonuçlanan

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

Yanıtlar:


14

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);

QUOTENAMEDoğ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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.