Để bắt đầu điều này, tôi nhận thức được rằng các truy vấn được tham số hóa là lựa chọn tốt nhất, nhưng tôi hỏi điều gì làm cho chiến lược tôi trình bày dưới đây dễ bị tổn thương. Mọi người nhấn mạnh giải pháp dưới đây không hiệu quả, vì vậy tôi đang tìm một ví dụ về lý do tại sao nó lại không thành công.Làm thế nào có thể vệ sinh mà thoát khỏi dấu nháy đơn bị đánh bại bởi SQL injection trong SQL Server?
Nếu SQL động được xây dựng trong mã bằng cách sử dụng thoát sau đây trước khi được gửi đến một máy chủ SQL, loại tiêm nào có thể đánh bại điều này?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
Câu hỏi tương tự đã được trả lời here, nhưng tôi không tin bất kỳ câu trả lời nào được áp dụng tại đây.
Việc thoát dấu nháy đơn bằng dấu "\" không thể thực hiện được trong SQL Server.
Tôi tin rằng SQL Smuggling với Unicode (được vạch ra here) sẽ bị cản trở bởi thực tế là chuỗi được tạo ra được đánh dấu là Unicode bởi N trước dấu nháy đơn. Theo như tôi biết, không có bộ ký tự khác mà SQL Server sẽ tự động dịch sang một trích dẫn duy nhất. Nếu không có một trích dẫn duy nhất, tôi không tin rằng tiêm là có thể.
Tôi không tin rằng Cắt ngắn chuỗi cũng là một vector khả thi. SQL Server chắc chắn sẽ không thực hiện cắt xén vì kích thước tối đa cho một nvarchar
là 2GB according to microsoft. Chuỗi 2 GB không khả thi trong hầu hết các trường hợp và không thể xảy ra trong tôi.
Thứ hai theo thứ tự tiêm có thể là có thể, nhưng là nó có thể nếu:
- Tất cả dữ liệu đi sâu vào cơ sở dữ liệu được vệ sinh bằng cách sử dụng phương pháp trên
- giá trị từ cơ sở dữ liệu không bao giờ được nối vào SQL động (tại sao bạn sẽ làm điều đó dù sao, khi bạn chỉ có thể tham khảo giá trị bảng trong phần tĩnh của bất kỳ chuỗi SQL động nào?).
Tôi không cho rằng điều này tốt hơn hoặc thay thế cho việc sử dụng truy vấn được tham số hóa, nhưng tôi muốn biết cách tôi vạch ra là dễ bị tổn thương. Bất kỳ ý tưởng?
No. Bạn vẫn dễ bị tấn công dưới dạng: "userInput' khi' userInput' là '0 ; DROP BẢNG OhNo; '. – Yuck
Điều này không có ý nghĩa. Trong ví dụ trên, đầu vào của người dùng của bạn sẽ được vệ sinh thành N'0; DROP BẢNG OhNo; ' trước khi bị xử tử. – GBleaney
Điều này chỉ áp dụng cho các biến chuỗi khử trùng. Những thứ như "int" không cần phải được khử trùng nếu chúng được đúc dưới dạng int trước khi được thêm vào truy vấn. Bất kể, tôi chỉ hỏi về việc vệ sinh dây ngay bây giờ. Ngoài ra, không cần phải thô lỗ ở đây. Nếu bạn có thể nghĩ ra một cách mà điều này không an toàn, tôi rất muốn biết. – GBleaney