Trả lời cho câu hỏi trực tiếp của bạn:Mã này có ngăn chặn việc đưa vào SQL không:Không
Đây là bằng chứng - đẩy chuỗi này thông qua phương thức Chuẩn bị sẵn:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Tôi đã sửa đổi phương thức GetRecord mà bạn đã đăng để trả về chuỗi SQL đã chuẩn bị đầy đủ thay vì lấy bản ghi từ cơ sở dữ liệu:
Console.WriteLine(GetRecord(output))
Và đây là đầu ra
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Thêm 1 dòng mã bổ sung:
My.Computer.Clipboard.SetText(input)
Và bạn đã có chuỗi mà bạn cần sao chép ngay vào khay nhớ tạm để dán vào trường nhập liệu trên trang web để hoàn thành việc chèn SQL của bạn:
'; Drop Table TableName; - -
[Lưu ý rằng các ký tự điều khiển đã bị StackOverflow bỏ qua khỏi đầu ra của bài đăng, vì vậy bạn sẽ phải làm theo ví dụ mã để tạo đầu ra của mình]
Sau khi phương thức Chuẩn bị sẵn sàng được chạy, nó sẽ có cùng một kết quả đầu ra - mã Chr (8) ASCII là dấu cách xóa lùi sẽ loại bỏ dấu "'" thừa mà bạn đang thêm vào sẽ đóng chuỗi của bạn và sau đó tôi miễn phí để thêm bất cứ điều gì tôi muốn vào cuối. Chuẩn bị của bạn không nhìn thấy chuỗi của tôi - bởi vì tôi thực sự đang sử dụng - - với một ký tự xóa lùi để xóa khoảng trắng.
Sau đó, mã SQL kết quả mà bạn đang xây dựng sẽ thực thi câu lệnh Drop Table của tôi mà không bị cản trở và nhanh chóng bỏ qua phần còn lại của truy vấn của bạn.
Điều thú vị về điều này là bạn có thể sử dụng các ký tự không in được để về cơ bản bỏ qua bất kỳ kiểm tra ký tự nào mà bạn có thể phát minh ra. Vì vậy, an toàn nhất là sử dụng các truy vấn được tham số hóa (không phải là những gì bạn đã hỏi, nhưng là cách tốt nhất để tránh điều này).