Xây dựng truy vấn theo cách này khiến nó dễ bị tấn công SQL injection trừ khi bạn đã thoát khỏi đầu vào của mình theo cách thủ công (I.E. khiến giá trị của 'projectID' không thể thay đổi cấu trúc của truy vấn bằng cách sử dụng trình tự thoát cụ thể của công cụ cơ sở dữ liệu). Tuy nhiên, cách được khuyến nghị để làm điều này là sử dụng các truy vấn được tham số hóa (đôi khi được gọi là "Câu lệnh chuẩn bị"). Với các truy vấn được tham số hóa, bạn chỉ cần xác định cấu trúc của truy vấn và sau đó cung cấp các giá trị đầu vào riêng biệt dưới dạng tham số, ngăn cấu trúc truy vấn của bạn không bao giờ bị thay đổi thông qua SQL injection.
Đây là ví dụ của bạn, đã được thay đổi để sử dụng tham số hóa:
public DataSet GetProject(string projectID)
{
DataSet dataTable = new DataSet();
DataAccess dataAccess = new DataAccess();
OracleCommand commandOb = new OracleCommand();
strQuery = @"select projectName, managerName
from project
where projectID = :ProjectID"
cmd.CommandText = strQuery;
cmd.Parameters.AddWithValue("ProjectID", projectID);
dataTable = dataAccess.ExecuteDataAdapter(commandOb);
return dataTable;
}
Tham số ':ProjectID' trong truy vấn sẽ được thay thế bằng giá trị được cung cấp trong phương thức 'AddWithValue'. Bất kể giá trị nào trong biến 'projectID', nó sẽ luôn được đánh giá là một phần của mệnh đề WHERE. Trong khi, trước đây, một giá trị tương tự như ['; XÓA khỏi dự án; -] có thể có ảnh hưởng không mong muốn bằng cách thay đổi truy vấn của bạn thành đọc như sau:
select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'