2009-05-29 37 views
10

Sử dụng SqlParameters là phương pháp được đề xuất để ngăn SQL Injection trong truy vấn cơ sở dữ liệu của bạn. Tôi có thể tìm mã/chức năng mà nội bộ làm vệ sinh các thông số này ở đâu? Tôi muốn tái sử dụng chức năng này trong một triển khai tùy chỉnh của tôi. Tôi đã cố gắng tìm nó bằng cách sử dụng Reflector, nhưng đã không thành công.SqlCommand khử trùng các thông số như thế nào?

+0

Câu hỏi hay - điều quan trọng là phải hiểu mức độ bảo mật được cung cấp bởi việc sử dụng các truy vấn được tham số hóa đến mức nào. – RedFilter

Trả lời

24

Nó bảo vệ chống lại SQL Injection, không phải XSS và không có mã hoặc chức năng làm vệ sinh dữ liệu tham số.

Việc bảo vệ được thực hiện bằng cách truyền các giá trị tham số đến máy chủ tách biệt với chuỗi truy vấn, sao cho các giá trị là không bao giờ thay thế trực tiếp vào câu lệnh sql.

Vì vậy, thay vì máy chủ sql chạy một cái gì đó như thế này:

SELECT * FROM [table] WHERE [column] = ParameterValue 

Nó Hơn nữa, nếu như nó chạy một cái gì đó như thế này:

DECLARE @ParamValue int 
    -- //@ParamValue variable is populated from the framework in a safe way 
SELECT * FROM [table] WHERE [column] = @ParamValue 

Đây là nhanh hơn và an toàn hơn nhiều và mạnh mẽ hơn so với một chức năng sẽ phải đánh giá dữ liệu tham số. Một hàm như vậy sẽ cần phải rất phức tạp (đọc: dễ bị lỗi) để xử lý những thứ như custom escape characters và các cải tiến trong tương lai.

Các bước bên gọn gàng này là toàn bộ vấn đề: dữ liệu là dữ liệu, mã là mã và không bao giờ cả hai phải đáp ứng.


bình luận của bạn cho người khác, bây giờ bị xóa, câu trả lời:

Nếu tôi vượt qua trong các giá trị O'Rourke, nó mã hóa nó được O''Rourke để nó không phá vỡ truy vấn. Chính xác?

Không, điều đó không chính xác. Biến được tạo trực tiếp từ một khối dữ liệu và do đó không cần phải thoát hoặc mã hóa đặc biệt.

+0

OK, có ý nghĩa, cảm ơn. "// @ ParamValue biến được điền từ khung theo cách an toàn" cách này được điền theo cách an toàn sau đó? –

+0

Nó không phải sql - biến được tạo bởi máy chủ sql từ khối _data_ được truyền từ máy khách, nhưng nó được giữ trong một đoạn dữ liệu và không bao giờ được coi là mã, và vì vậy dữ liệu không cần phải được thoát hoặc được mã hóa. –

+0

Bạn có biết bất kỳ tài liệu chi tiết nào về vấn đề này không? Tôi thực sự muốn hiểu toàn bộ quá trình. –

Các vấn đề liên quan