2010-09-29 6 views
9

Đây có phải là quy tắc LINQ dễ bị tấn công bởi SQL injection không?Bức thư LINQ này có dễ bị tấn công với SQL injection không?

var result = from b in context.tests 
    where b.id == inputTextBox.Text 
    select b; 

ngữ cảnh là thực thể và thử nghiệm là bảng. Tôi đang cố gắng để tìm hiểu LINQ và tôi nghĩ rằng lợi ích của nó là nó không phải là dễ bị tiêm sql, nhưng một số công cụ tôi đã thấy đã nói khác nhau. Tôi có cần phải parametrize này LINQ tuyên bố để làm cho nó an toàn hơn? Nếu vậy, Làm thế nào?

Ngoài ra điều này cũng được coi là linq để sql hoặc LINQ đối với các thực thể?

Trả lời

31

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.

sql injection

+0

đặt trong khối trích dẫn thay vì một khối mã – msarchet

+0

Vâng, hãy bỏ lỡ nút. Cảm ơn bạn đã chỉ ra. –

+1

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

2

Không. LINQ to Entities và LINQ to SQL xử lý việc tạo truy vấn SQL để tránh SQL Injection. Bạn có thể sử dụng LINQPad nếu bạn tò mò muốn xem câu lệnh SQL nào được tạo ra khi bạn chạy truy vấn này với các đầu vào khác nhau.

Cho dù đó là LINQ to SQL hay LINQ to Entities phụ thuộc vào đối tượng context của bạn là gì và không thể được xác định từ đoạn mã này.

Lần duy nhất bạn cần phải lo lắng về việc chèn SQL trong LINQ là nếu bạn đang sử dụng phương thức ExecuteQuery để chạy truy vấn SQL tùy chỉnh (see here). Nhưng tại thời điểm đó, bạn đã chuyển đi khỏi Truy vấn không được phân tách theo ngôn ngữ và trở lại thế giới tạo chuỗi của riêng bạn.

2

LINQ sử dụng truy vấn được tham số hóa, do đó, thường không dễ bị tiêm SQL. Ví dụ của bạn, ví dụ, không phải là dễ bị tổn thương.

2

Nhà cung cấp LINQ to Entities sử dụng các truy vấn được truy vấn và hoàn toàn an toàn chống lại SQL injection.

1

LINQ To SQL tạo ra một truy vấn parameterised nên nó bảo vệ chống lại các cuộc tấn công SQL injection

0

LINQ paramaterizes tất cả truy vấn, như vậy là không dễ bị tấn công SQL injection. Tuy nhiên bạn vẫn nên xác nhận tất cả các đầu vào của người dùng của bạn nếu không bạn sẽ để lại cho mình mở để tấn công kịch bản trang web chéo.

+0

Trong khi tôi đồng ý rằng đầu vào của người dùng phải được xác thực, tôi không thấy những tấn công script cross site nào phải làm với nó . – StriplingWarrior

+0

Cũng phụ thuộc vào những gì thực sự được thực hiện với dữ liệu, nếu bạn hiển thị dữ liệu thẳng ra khỏi cơ sở dữ liệu, bất kỳ tập lệnh tùy chỉnh nào sẽ/có thể được thực thi. – Padwah

+0

Ồ, vậy bạn đang nói về nếu bạn không thoát khỏi HTML khi bạn hiển thị văn bản do người dùng nhập trong trình duyệt, phải không? Đó không phải là những gì tôi muốn phân loại là xác thực người dùng đầu vào, nhưng tôi thấy những gì bạn có ý nghĩa. – StriplingWarrior