2016-06-08 19 views
6

tôi đã nhận thấy rằng khi sử dụng Có trong EFTiêm SQL có thể khi sử dụng chứa với EF?

.Where(i => myListOfStrings.Contains(i.Value)) 

SQL được tạo ra trông như thế này

IN ('Value1', 'Value2') 

Kể từ khi giá trị không phải là tham số, chứ không phải là nó có thể tiêm một số SQL?

+0

Bạn đang xem SQL được tạo từ đâu? Hồ sơ? Tôi cho rằng EF đang thực hiện mã hóa chuỗi có liên quan của các giá trị trước khi chuyển truy vấn. –

+0

Hãy dùng thử! Chuyển vào một cái gì đó như '') HOẶC 1 = 1 -' – Rodders

+0

http://stackoverflow.com/questions/473173/will-using-linq-to-sql-help-prevent-sql-injection –

Trả lời

3

Nó sẽ không chỉ vô tình xây dựng tuyên bố IN từ Contains của bạn. Ít nhất nó sẽ thoát khỏi dấu nháy đơn (bằng cách tăng gấp đôi chúng). Giả sử bạn muốn tiêm một cái gì đó như "') OR 1 = 1-" như gợi ý trong các ý kiến, giả định rằng nó sẽ được chuyển đổi sang:

where ... IN ('') OR 1 = 1 -- the rest 

Nhưng vì dấu nháy đơn được thoát khỏi đó sẽ là:

where ... IN (''') OR 1 = 1 --' -- the rest 

Vì vậy, chúng tôi an toàn ở đây, bởi vì toàn bộ câu lệnh của bạn được coi là chuỗi.

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