SQL Server có quá nhiều thứ để tìm hiểu và tôi luôn thấy nó thật tuyệt vời. Các cuộc trò chuyện của tôi với khách hàng thường đưa ra các câu hỏi bảo mật, đặc biệt là xung quanh SQL Injection. Nhiều người đã tuyên bố rằng SQL Injection là một sự cố của SQL Server. Phải mất khá nhiều thời gian để tôi cho họ biết không có gì về SQL Server và SQL Injection. SQL Injection là kết quả của việc thực hành mã hóa sai. Một trong những khuyến nghị tôi đưa ra là không sử dụng SQL động. Có thể có một số tình huống mà bạn không thể tránh được. Lời khuyên duy nhất của tôi là, hãy tránh nếu có thể. Trong blog này, tôi sẽ trình bày sự cố SQL Injection do SQL động và một giải pháp khả thi mà bạn có thể có.
Giả sử rằng chúng ta có một trang tìm kiếm đơn giản nơi người dùng có thể sử dụng tìm kiếm trống hoặc cung cấp bộ lọc trong bất kỳ trường nào. Chúng tôi đã cung cấp hai trường để sử dụng "Tên" và "Họ". Người dùng gõ một cái gì đó và nhấn tìm kiếm. Đây là mã quy trình được lưu trữ của chúng tôi sẽ kích hoạt sau hiện trường.
USE AdventureWorks2014 GO CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName ,MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE ''' + @firstName + '''' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE ''' + @lastName + '''' EXEC (@sql) END
Nếu tôi sử dụng chuỗi này để thực thi trong họ ”; thả bảng t1–
EXEC search_first_or_last '%K%', ''';drop table t1--'
Chuỗi động sẽ là
SELECT FirstName, MiddleName, LastName FROM Person. Person WHERE 1 = 1 AND FirstName LIKE '%K%' AND LastName LIKE '';DROP TABLE t1--'
Bạn có thấy vấn đề không? Có, người dùng có thể bỏ bảng t1 nếu mã đang chạy trong tài khoản đặc quyền cao.
Một trong những giải pháp của vấn đề là sử dụng sp_executesql. Đây là phiên bản tốt hơn bằng cách sử dụng
CREATE PROCEDURE search_first_or_last @firstName NVARCHAR(50) ,@lastName NVARCHAR(50) AS BEGIN DECLARE @sql NVARCHAR(4000) SELECT @sql = ' SELECT FirstName , MiddleName, LastName' + ' FROM Person.Person WHERE 1 = 1 ' IF @firstName IS NOT NULL SELECT @sql = @sql + ' AND FirstName LIKE @firstName' IF @lastName IS NOT NULL SELECT @sql = @sql + ' AND LastName LIKE @lastName ' EXEC sp_executesql @sql ,N'@firstName nvarchar(50), @lastName nvarchar(50)' ,@firstName ,@lastName END
Hy vọng bạn có thể sử dụng và triển khai trong dự án của mình. Bạn có đang sử dụng những kỹ thuật đơn giản này trong mã sản xuất của mình không? Bạn đã bao giờ gặp phải những vấn đề tương tự trong quá trình kiểm toán chưa? Hãy cho tôi biết về kiến thức của bạn.