Tôi đang cố gắng để đơn giản chứng minh ở đây là chức năng đơn giản này là không đủ tốt để ngăn chặn tất cả các sql injection trên thế giới:minh SQL Injection
Function CleanForSQL(ByVal input As String) As String
Return input.Replace("'", "''")
End Function
Đây là một tuyên bố chèn điển hình từ một trong những ứng dụng của chúng tôi :
Database.DBUpdate("UPDATE tblFilledForms SET Text1 = '" + CleanForSQL(txtNote.Text) + "' WHERE FilledFormID = " + DGVNotes.SelectedRows(0).Cells("FilledFormID").Value.ToString)
Tôi biết nó không an toàn, vì googling và tra cứu các câu hỏi khác trên StackOverflow.com. Here là một câu hỏi mà tôi tìm thấy trong đó tất cả các chức năng như tôi đã trình bày ở trên là không liên quan và vô nghĩa.
Vì vậy, dựa trên các bài tôi liên kết với, chỉ cần gõ
'Chr (8); cập nhật tblMaint SET Value1 = 2 ĐÂU ValueID = 2--
vào txtNote nên đủ để xóa tất cả các giá trị trong text1 trong toàn bộ bảng tblFilledForms, và sau đó cập nhật hàng thứ hai bảng tblmaint để được 2 có đúng không?
gì sẽ xảy ra ở đây là VB sẽ giải thích điều này như
tblFilledForms cập nhật bộ Text1 = '' 'Chr (8); cập nhật tblMaint SET Value1 = 2 ĐÂU ValueID = 2-- 'WHERE FilledFormID = 5120327
và gửi cho SQL mà sẽ thực tập thực hiện Chr (8) để xóa thứ ba' mà sẽ tạo ra
CẬP NHẬT tblFilledForms SET Text1 = ''; cập nhật giá trị TblMaint SET Value1 = 2 WHERE ValueID = 2-- 'WHERE FilledFormID = 5120327
để thực sự được thực thi trên cơ sở dữ liệu chính xác?
Tôi sau đó coppied một Chr (8) từ clipboard và thay thế Chr (8) trong hộp văn bản với nội dung clipboard và vẫn không có. Nó đặt toàn bộ chuỗi trực tiếp vào trường w/o vấn đề.
Vì vậy, tôi đang làm gì sai ở đây? hoặc tôi có thể làm gì khác để phá vỡ nó?
Công nghệ và nền: Tôi đang sử dụng MS SQL Server 2005 và VB .NET 2005. trường Text1 trong cơ sở dữ liệu là trường Varchar (600) (không hỏi lý do tại sao không phải MAX, vô nghĩa của nó, tôi biết) Có một số tác nhân nhất định trên bàn có thể ngăn chặn cập nhật hàng loạt như thế này và ném một số lỗi nếu tiêm thực sự hoạt động đúng.
PS. Tôi biết parametrized truy vấn là con đường để đi ở đây và tôi không tìm kiếm câu trả lời như "cũng i dunno lý do tại sao nó không hoạt động, nhưng parametrized truy vấn là con đường để đi". Tôi đang tìm kiếm khả năng chứng minh rằng phần mềm của chúng tôi bị hỏng và chúng tôi cần phải viết lại nó bằng các nguyên tắc tốt hơn.
Đối với bất kỳ ai đọc câu hỏi này để tìm hiểu cách lọc tốt hơn các trường văn bản của bạn, câu trả lời KHÔNG ĐƯỢC! Sử dụng các thông số! chúng tốt hơn, an toàn hơn và dễ dàng hơn!
Lưu ý vì đe doạ mọi người và viết hiệu trưởng thay vì các nguyên tắc trong cùng một đoạn. –
Vâng Chr của bạn (8) kết thúc bên trong một chuỗi vì vậy đó là lý do tại sao SQL không đánh giá nó. –
@Vinko Tôi không nghĩ rằng đó là công bằng, ông chỉ đơn giản là thiết lập một hướng dẫn cho câu trả lời.Vì vậy, thay vì nhận được một loạt các câu trả lời tất cả đều nói cùng một điều, anh ta nhận được 1 hoặc 2 cho anh ta biết anh ta muốn gì. – Zoidberg