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 QUOTENAME
chí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 '-'.