2016-06-08 18 views
6

Zauważyłem, że podczas korzystania Zawiera w EFMożliwy Injection SQL przy użyciu zawiera EF?

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

Wygenerowany SQL wygląda tak

IN ('Value1', 'Value2') 

Ponieważ wartości nie są parametryzowane, nie jest to możliwe, aby wprowadzić pewne SQL?

+0

Gdzie przeglądasz wygenerowany kod SQL? Profiler? Zakładam, że EF wykonuje odpowiednie kodowanie ciągów wartości przed przekazaniem zapytania. –

+0

Wypróbuj! Przekaż coś w stylu '') LUB 1 = 1 -' – Rodders

+0

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

Odpowiedz

3

To nie tylko bezmyślnie skonstruować instrukcję IN ze swojego Contains. Przynajmniej uniknie pojedynczych cudzysłowów (podwajając je). Załóżmy, że chcemy wprowadzić coś takiego jak „') lub 1 = 1--” jak sugeruje się w komentarzach, przy założeniu, że zostaną zamienione na:

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

Ale ponieważ pojedyncze cudzysłowy są uciekł, które będą:

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

Jesteśmy tutaj bezpieczni, ponieważ całe twoje oświadczenie traktowane jest jako ciąg.