ฟังก์ชั่นที่คุณกำลังมองหาคือQUOTENAME
!
ด้วยการใช้ประโยชน์จากเทคโนโลยี Square bracket คุณสามารถห่อหุ้มสตริงเพื่อช่วยในการป้องกันการโจมตี 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' นี่เป็นโค้ดที่สร้างขึ้นเอง มันอาจจะทิ้งโต๊ะหรือให้สิทธิ์ '-'