Bạn muốn giảm thiểu cơ hội cho những kẻ tấn công khi họ đưa mã SQL nguy hiểm vào các giá trị thông số lệnh.
Sử dụng một truy vấn được-thông-số-hóa (parameterized query).
Nhiều ứng dụng xây dựng các câu lệnh SQL động bằng cách phân tích các mẩu rời thành một chuỗi lớn. Cách tiếp cận này phát sinh vấn đề khi làm việc với dữ liệu nhị phân, và cũng dựng lên khả năng một kẻ tấn công có thể thực thi mã SQL nguy hiểm bằng cách “tiêm” nó vào một giá trị thông số. Mã nguy hiểm này có thể được sử dụng để can thiệp vào thông tin trong cơ sở dữ liệu hoặc ngay cả chạy một ứng dụng khác trên server. Bạn có thể xem một số ví dụ đáng sợ trên các server cơ sở dữ liệu tại [http://www.owasp.org/asac/input_validation/sql.shtml].
Để ngăn chặn vấn đề này, bạn nên xác nhận tính hợp lệ của đầu vào do người dùng cung cấp, kiểm tra rằng nó có kiểu dữ liệu đúng như mong muốn, không dài khác thường, v.v... Cách dễ nhất để thực hiện điều này là sử dụng một truy vấn được-thông-số-hóa.
Các truy vấn được-thông-số-hóa được sử dụng cho tất cả các lời gọi thủ tục tồn trữ, nhưng bạn cũng có thể sử dụng chúng với các lệnh SQL động. Trong trường hợp thứ hai, bạn chỉ cần lấy một lệnh SQL bình thường và thay thế các giá trị động với các thông số (kết quả sẽ trông giống như phần thân của một thủ tục tồn trữ đơn giản). Dưới đây là một lệnh SQL được-thông-số-hóa:
INSERT INTO Shippers (CompanyName, Phone) VALUES (@CompanyName, @Phone)
Để sử dụng lệnh này, bạn cần thêm các đối tượng Parameter tương ứng vào đối tượng Command (với các giá trị phù hợp). Trường hợp này yêu cầu hai thông số (@CompanyName và @Phone). Ứng dụng Console dưới đây sử dụng truy vấn được-thông-số-hóa này để thêm một bản ghi mới vào bảng Shippers của cơ sở dữ liệu Northwind.
Trích từ “Các giải pháp lập trình VISUAL BASIC .NET (tập 2)”
Sử dụng một truy vấn được-thông-số-hóa (parameterized query).
Nhiều ứng dụng xây dựng các câu lệnh SQL động bằng cách phân tích các mẩu rời thành một chuỗi lớn. Cách tiếp cận này phát sinh vấn đề khi làm việc với dữ liệu nhị phân, và cũng dựng lên khả năng một kẻ tấn công có thể thực thi mã SQL nguy hiểm bằng cách “tiêm” nó vào một giá trị thông số. Mã nguy hiểm này có thể được sử dụng để can thiệp vào thông tin trong cơ sở dữ liệu hoặc ngay cả chạy một ứng dụng khác trên server. Bạn có thể xem một số ví dụ đáng sợ trên các server cơ sở dữ liệu tại [http://www.owasp.org/asac/input_validation/sql.shtml].
Để ngăn chặn vấn đề này, bạn nên xác nhận tính hợp lệ của đầu vào do người dùng cung cấp, kiểm tra rằng nó có kiểu dữ liệu đúng như mong muốn, không dài khác thường, v.v... Cách dễ nhất để thực hiện điều này là sử dụng một truy vấn được-thông-số-hóa.
Các truy vấn được-thông-số-hóa được sử dụng cho tất cả các lời gọi thủ tục tồn trữ, nhưng bạn cũng có thể sử dụng chúng với các lệnh SQL động. Trong trường hợp thứ hai, bạn chỉ cần lấy một lệnh SQL bình thường và thay thế các giá trị động với các thông số (kết quả sẽ trông giống như phần thân của một thủ tục tồn trữ đơn giản). Dưới đây là một lệnh SQL được-thông-số-hóa:
INSERT INTO Shippers (CompanyName, Phone) VALUES (@CompanyName, @Phone)
Để sử dụng lệnh này, bạn cần thêm các đối tượng Parameter tương ứng vào đối tượng Command (với các giá trị phù hợp). Trường hợp này yêu cầu hai thông số (@CompanyName và @Phone). Ứng dụng Console dưới đây sử dụng truy vấn được-thông-số-hóa này để thêm một bản ghi mới vào bảng Shippers của cơ sở dữ liệu Northwind.
Public Module ParameterizedQuery Private ConnectionString As String = "Data Source=localhost;" & _ "Integrated Security=SSPI;Initial Catalog=Northwind" Public Sub Main() ' Tạo kết nối và câu lệnh. Dim Con As New SqlConnection(ConnectionString) Dim UpdateSQL As String = "INSERT INTO Shippers " & _ "(CompanyName, Phone) VALUES (@CompanyName, @Phone)" Dim Cmd As New SqlCommand(UpdateSQL, Con) ' Thêm các thông số nhập. Dim Param As SqlParameter = Cmd.Parameters.Add("@CompanyName", _ SqlDbType.NVarChar, 40) Param.Value = "Test Company" Param = Cmd.Parameters.Add("@Phone", SqlDbType.NVarChar, 24) Param.Value = "(503) 555-9931" Try ' Thực thi câu lệnh. Con.Open() Dim Rows As Integer = Cmd.ExecuteNonQuery() Console.WriteLine(Rows.ToString() & " row(s) affected.") Catch Err As Exception Console.WriteLine(Err.ToString()) Finally Con.Close() End Try Console.ReadLine() End SubEndModule
Trích từ “Các giải pháp lập trình VISUAL BASIC .NET (tập 2)”