Tôi đang tạo một số SQL động và muốn đảm bảo rằng mã của tôi được an toàn từ SQL injection.Vệ sinh tên bảng/cột trong SQL động trong .NET? (Ngăn chặn các cuộc tấn công SQL injection)
Đối với lợi ích của lập luận đây là một ví dụ nhỏ về cách nó được tạo ra:
var sql = string.Format("INSERT INTO {0} ({1}) VALUES (@value)",
tableName, columnName);
Ở phía trên, tableName
, columnName
, và bất cứ điều gì là ràng buộc để @value
đến từ một nguồn không tin cậy. Vì trình giữ chỗ đang được sử dụng @value
là an toàn từ các cuộc tấn công SQL injection và có thể bỏ qua. (Các lệnh được thực thi thông qua SqlCommand.)
Tuy nhiên, tableName
và columnName
không thể bị ràng buộc như placeholders và do dễ bị tổn thương để tấn công tiêm. Vì đây là một kịch bản "thực sự năng động", không có danh sách trắng nào cho số tableName
hoặc columnName
.
Câu hỏi đặt ra là như sau:
Có một tiêu chuẩn , built-in cách để kiểm tra và/hoặc khử trùng tableName
và columnName
? (SqlConnection, hoặc một lớp trợ giúp, vv) Nếu không, cách tốt nhất để thực hiện nhiệm vụ này là mà không cần sử dụng thư viện của bên thứ ba là gì?
Ghi chú:
- Tất cả các định danh SQL, bao gồm các lược đồ, nên bằng cách chấp nhận: ví dụ:
[schema].[My Table].column
chỉ là "an toàn" làtable1
. - Có thể khử trùng số nhận dạng hoặc phát hiện số nhận dạng không hợp lệ. (Nó không cần phải đảm bảo rằng các bảng/cột là thực sự có giá trị trong bối cảnh; SQL kết quả có thể là không hợp lệ, nhưng phải "an toàn".)
Cập nhật:
Chỉ cần tìm thấy điều này, và nghĩ rằng nó có phần thú vị: Có một hàm SqlFunctions.QuoteName trong .NET4 (EF4?). Ok, nó không thực sự giúp tôi ở đây ...
Bạn chính xác, đó thực sự là SQL Server. Tôi đang hướng tới một tuyến đường biểu hiện thường xuyên * tối thiểu * được chấp nhận, nhưng tôi đã hy vọng rằng một cái gì đó premade (và thử nghiệm ;-) tồn tại. Tôi thực sự thích ý tưởng bổ sung về việc kiểm tra nó dựa vào siêu dữ liệu lược đồ. –
Nếu bạn sử dụng truy vấn tham số để kiểm tra bảng/lược đồ, hãy kiểm tra sự tồn tại của từng tên cột trong mã với danh sách đầy đủ các tên cột cho bảng, sau đó bạn thực sự không cần thực hiện bất kỳ kiểm tra tính hợp lệ nào trên các giá trị đến , đó sẽ là tối ưu trong mức tối thiểu :). –
Vâng, đó là triển khai * nhỏ * lớn hơn :) –