Fungsi yang Anda cari adalah QUOTENAME
!
Melalui penggunaan praktis teknologi braket persegi, Anda dapat dengan aman merangkum string untuk membantu dalam pencegahan serangan injeksi SQL panas.
Perhatikan bahwa hanya menempelkan tanda kurung di sekitar sesuatu tidak dengan aman mengutipnya, meskipun Anda dapat menghindari kesalahan kode dengan karakter yang tidak valid dalam nama objek.
Kode yang baik
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d
Kode salah
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d
Untuk memberikan contoh spesifik ...
Berikut ini berfungsi dengan baik untuk input awal
DECLARE @ObjectName SYSNAME = 'sysobjects';
DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';
EXEC (@dynSql);
Tetapi dengan input berbahaya itu rentan terhadap injeksi 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);
Menggunakan QUOTENAME
dengan benar lolos dari tertanam ]
dan mencegah upaya injeksi SQL terjadi.
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);
Nama objek 'sysobjects]; SELECT' Ini adalah beberapa kode arbitrer yang dijalankan. Mungkin telah menjatuhkan tabel atau memberikan izin '-'.