2011-05-11 16 views
5

Obecnie robię projekt z C# i LINQ-TO-SQL. Ten projekt ma bezpieczeństwo jako priorytet, więc oczywiście chcę zapobiec iniekcjom SQL. Przeszukałem tę sprawę, ale nie okazało się to przydatne. Własne FAQ Microsoftu powiedziały mi, że iniekcje nie stanowią problemu, ze względu na sposób, w jaki LINQ obsługuje parametry, jednak widząc kod LINQ w debugerze i czytając nieco o tym, jak LINQ-To-SQL po prostu buduje SQL, nie jestem na pewno, w jaki sposób to ma zastosowanie.W jaki sposób LINQ-To-SQL zapobiega iniekcjom SQL?

Czy ktoś ma jakąkolwiek literaturę/powiązanie, które zajmuje się tą sprawą?

Odpowiedz

6

LINQ do SQL automatycznie używa SQLParameters. Wprowadzane przez użytkownika wartości są przekształcane na wartości parametrów, zamiast po prostu być połączonym łańcuchem (co pozwala na iniekcje SQL). Tak dzieje się z serwerem, IIRC, więc możesz po prostu zobaczyć kod po stronie klienta. Jeśli chcesz trochę więcej tła i informacji, możesz przeczytać the information here.

+0

Dobra, Strona 2 tego artykułu wyjaśniła moje pytanie. Dziękuję za Twoją odpowiedź! – fk2

6

To jest naprawdę proste - tłumaczenie nigdy nie wstrzykuje zmiennych bez ich parametryzacji; tak:

var orders = from ord in ctx.Orders 
      where ord.CustomerName = name 
      select ord; 

staną:

SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @p0 

gdzie p0 jest parametrem o wartości pobranej z przechwyconego name

nic więcej, nic mniej. Ale to pozwala uniknąć ataków wtrysku. Przeciwieństwie do nieprawidłowy przypadkowa:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = '" + name + "'"; 

która wprowadza ogromne ryzyko. Można oczywiście parametryzacji wyżej poprawnie, zbyt:

var sql = "SELECT * FROM [dbo].[Orders] WHERE [CustomerName] = @name"; 

(i dodać parametr @name o wartości od name)

+0

Jak to zrobić? Powiedzmy, że mam pole wejściowe zawierające ciąg. Ktoś wchodzi "Drop Database" lub coś podobnego. Oznacza to "WYBIERZ * Z [Zamówienia] WHERE [CustomerId] =; Drop Database". Czy nie mam wtedy problemu? – fk2

+0

@ fk2, Myślę, że nie rozumiesz sparametryzowanego sql ... – canon

+1

@ fk2 '@ p0' *** jest parametrem ***; nigdy nie jest oceniany jako TSQL; może to być dowolna treść łańcucha, bez żadnego ryzyka. –

Powiązane problemy