Tôi nhận ra rằng các truy vấn SQL được tham số hóa là cách tối ưu để vệ sinh đầu vào của người dùng khi xây dựng các truy vấn có chứa đầu vào của người dùng, nhưng tôi tự hỏi có gì sai khi lấy đầu vào của người dùng và thoát khỏi bất kỳ dấu ngoặc đơn nào và bao quanh toàn bộ chuỗi bằng dấu ngoặc đơn. Đây là mã:
sSanitizedInput = "'" & Replace(sInput, "'", "''") & "'"
Bất kỳ trích dẫn đơn nào mà người dùng nhập vào đều được thay thế bằng dấu ngoặc đơn, loại bỏ khả năng kết thúc chuỗi của người dùng, do đó, mọi thứ khác họ có thể nhập, chẳng hạn như dấu chấm phẩy, dấu phần trăm, v.v., đều sẽ là một phần của chuỗi và không thực sự được thực hiện như là một phần của lệnh.
Chúng tôi đang sử dụng Microsoft SQL Server 2000, do đó tôi tin rằng trích dẫn đơn là dấu phân tách chuỗi duy nhất và là cách duy nhất để thoát khỏi dấu phân cách chuỗi, vì vậy không có cách nào để thực thi bất cứ điều gì mà người dùng nhập vào.
Tôi không thấy cách nào để khởi động một cuộc tấn công SQL SQL chống lại điều này, nhưng tôi nhận ra rằng nếu điều này có khả năng chống đạn như tôi thì người khác sẽ nghĩ về nó và đó sẽ là thông lệ.
Có gì sai với mã này? Có cách nào để có được một cuộc tấn công tiêm SQL qua kỹ thuật vệ sinh này không? Mẫu đầu vào của người dùng khai thác kỹ thuật này sẽ rất hữu ích.
CẬP NHẬT:
Tôi vẫn không biết cách nào để khởi động một cuộc tấn công SQL SQL một cách hiệu quả đối với mã này. Một số người cho rằng dấu gạch chéo ngược sẽ thoát khỏi một trích dẫn và bỏ đoạn còn lại để kết thúc chuỗi để phần còn lại của chuỗi được thực thi như một phần của lệnh SQL và tôi nhận ra rằng phương thức này sẽ hoạt động để đưa SQL vào một cơ sở dữ liệu MySQL, nhưng trong SQL Server 2000, cách duy nhất (mà tôi có thể tìm thấy) để thoát khỏi một trích dẫn là với một trích dẫn khác; dấu gạch chéo ngược sẽ không làm điều đó.
Và trừ khi có một cách để ngăn chặn việc thoát khỏi trích dẫn đơn, không có phần còn lại nào của đầu vào người dùng sẽ được thực thi bởi vì tất cả sẽ được coi là một chuỗi liền kề.
Tôi hiểu rằng có nhiều cách tốt hơn để vệ sinh đầu vào, nhưng tôi thực sự quan tâm hơn đến việc tìm hiểu lý do tại sao phương pháp tôi cung cấp ở trên sẽ không hiệu quả. Nếu bất cứ ai biết bất kỳ cách cụ thể nào để thực hiện một cuộc tấn công tiêm nhiễm SQL chống lại phương pháp vệ sinh này, tôi rất muốn thấy nó.