Câu trả lời ngắn: LINQ là không dễ bị SQL injection.
Long trả lời:
LINQ không giống như SQL. Có một thư viện toàn bộ đằng sau hậu trường xây dựng SQL từ các cây biểu hiện được tạo ra bởi trình biên dịch từ mã của bạn, ánh xạ các kết quả tới các đối tượng — và tất nhiên nó sẽ đảm bảo làm cho mọi thứ an toàn trên đường đi.
Xem LINQ to SQL FAQ:
Q. Làm thế nào là LINQ to SQL bảo vệ khỏi các cuộc tấn công SQL -tiêm?
A. Chèn SQL là một nguy cơ đáng kể đối với các truy vấn SQL truyền thống được tạo thành bằng cách kết nối người dùng đầu vào. LINQ to SQL tránh việc tiêm như vậy bằng cách sử dụng SqlParameter trong các truy vấn . Dữ liệu nhập của người dùng được chuyển thành các giá trị tham số . Cách tiếp cận này ngăn các lệnh độc hại bị sử dụng từ dữ liệu nhập của khách hàng.
Bên trong, nó có nghĩa là khi LINQ to SQL truy vấn cơ sở dữ liệu, thay vì sử dụng các giá trị đơn giản, nó đi qua chúng như SQL thông số, có nghĩa là họ có thể bao giờ được coi là mã thực thi bởi các cơ sở dữ liệu.Điều này cũng đúng đối với hầu hết (nếu không phải tất cả) ORM lập bản đồ ra khỏi đó.
So sánh hai phương pháp này (hoàn toàn pseudo-code):
string name = "' ; DROP DATABASE master --"
run ("SELECT * FROM Authors WHERE Name = '" + name + "'") // oops!
// now we'd better use parameters
SqlParameter name = new SqlParameter ("@name", "' ; DROP DATABASE master --")
run ("SELECT * FROM Authors WHERE Name = @name", name) // this is pretty safe
Tôi đề nghị bạn đi sâu hơn vào những gì LINQ báo cáo thực sự có ý nghĩa và khi nào và như thế nào họ nhận được dịch sang SQL thực. Bạn có thể muốn tìm hiểu về LINQ standard query operator translation, deferred execution, different LINQ providers và cetera. Trong trường hợp của LINQ, giống như bất kỳ công nghệ trừu tượng nào, nó vừa hấp dẫn vừa vô cùng hữu ích để biết những gì đang diễn ra đằng sau hậu trường.
P.S. Mỗi khi tôi thấy một câu hỏi về SQL injection tôi không thể không nhớ webcomic này.
Nguồn
2010-09-29 20:57:32
đặt trong khối trích dẫn thay vì một khối mã – msarchet
Vâng, hãy bỏ lỡ nút. Cảm ơn bạn đã chỉ ra. –
Tuy nhiên, nếu bạn đang sử dụng LINQ để nối chuỗi và đầu vào, bạn vẫn có thể bị tổn thương. – Oded