Hàm nào trích dẫn một định danh trong động-sql với SQL Server?


11

Phương thức SQL Server của các định danh trích dẫn an toàn để tạo sql động là gì.

Làm cách nào để đảm bảo tên cột được tạo động cho câu lệnh được tạo động mà chính cột đó không phải là một cuộc tấn công SQL-tiêm.

Giả sử tôi có Câu lệnh SQL,

SELECT [$col] FROM table;

mà về cơ bản là giống như

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

Điều gì ngăn chặn một cuộc tấn công tiêm trong đó

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

Kết quả là

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

Câu trả lời:


14

Chức năng mà bạn đang tìm kiếm là QUOTENAME!

Thông qua việc sử dụng thực tế công nghệ khung vuông, bạn có thể đóng gói các chuỗi một cách an toàn để hỗ trợ ngăn chặn các cuộc tấn công SQL SQL nóng.

Lưu ý rằng chỉ dán dấu ngoặc vuông xung quanh một cái gì đó không trích dẫn nó một cách an toàn, mặc dù bạn có thể tránh được lỗi mã của mình với các ký tự không hợp lệ trong tên đối tượng.

Mã tốt

DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d

Mã xấu

DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d

Để đưa ra một ví dụ cụ thể ...

Sau đây hoạt động tốt cho đầu vào ban đầu

DECLARE @ObjectName SYSNAME = 'sysobjects';

DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';

EXEC (@dynSql);

Nhưng với đầu vào độc hại, nó dễ bị tấn công 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);

Việc sử dụng QUOTENAMEchính xác thoát khỏi nhúng ]và ngăn việc tiêm SQL cố gắng xảy ra.

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

Tên đối tượng không hợp lệ 'sysobjects]; SELECT' Đây là một số mã tùy ý được thực thi. Nó có thể đã đánh rơi một bảng hoặc được cấp quyền '-'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.