ฟังก์ชันใดที่เสนอราคาตัวระบุใน dynamic-sql กับ SQL Server


11

วิธีการ SQL Server ของตัวระบุการอ้างอิงอย่างปลอดภัยสำหรับการสร้าง sql แบบไดนามิกคืออะไร

ฉันจะมั่นใจได้อย่างไรว่าได้รับชื่อคอลัมน์ที่สร้างขึ้นแบบไดนามิกสำหรับคำสั่งที่สร้างขึ้นแบบไดนามิกว่าคอลัมน์นั้นไม่ใช่การโจมตี SQL-injection

สมมติว่าฉันมีคำสั่ง 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!

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.