2011-05-11 3 views
5

Attualmente sto facendo un progetto con C# e LINQ-TO-SQL. Questo progetto ha la sicurezza come una priorità elevata, quindi ovviamente voglio evitare le Iniezioni SQL. Ho cercato su Google, ma non sta rivelando nulla di utile. Le domande frequenti di Microsoft mi dicevano che le iniezioni non sarebbero state un problema, a causa del modo in cui LINQ gestisce i parametri, tuttavia vedendo il codice che LINQ produce in un debugger e avendo letto un po 'su come LINQ-To-SQL si basa su SQL non lo sono sicuro come questo si applica.In che modo LINQ-To-SQL impedisce le iniezioni SQL?

Qualcuno ha pubblicazioni/collegamenti che trattano questo argomento?

risposta

6

LINQ to SQL utilizza automaticamente SQLParameters. L'input dell'utente viene trasformato in valori di parametro anziché essere semplicemente una stringa concatenata (che è ciò che consente le iniezioni SQL). Questo succede serveride, IIRC, quindi potresti vedere il codice lato client. Se vuoi un po 'più di background e informazioni, puoi leggere the information here.

+0

Ok, la pagina 2 dell'articolo ha chiarito la mia domanda. La ringrazio per la risposta! – fk2

6

È piuttosto semplice, in realtà - la traduzione non inietta mai variabili senza parametrizzarle; così:

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

diventerà:

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

dove p0 è un parametro con valore assunto dal nulla catturato name

di più, niente di meno. Ma questo evita attacchi di iniezione. Contrariamente ad un accidentale errato:

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

che introduce rischi enormi. Ovviamente si può parametrizzare quanto sopra in modo corretto, anche:

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

(e aggiungere un parametro @name con valore da name)

+0

In che modo? Diciamo che ho un campo di input contenente una stringa. Qualcuno inserisce "; Drop Database" o qualcosa di simile. Ciò valuta 'SELECT * FROM [Orders] WHERE [CustomerId] =; Drop Database'. Non ho un problema allora? – fk2

+0

@ fk2, non penso che tu abbia capito sql parametrizzato ... – canon

+1

@ fk2 '@ p0' *** è un parametro ***; non viene mai valutato come TSQL; può essere qualsiasi contenuto di stringa, senza alcun rischio –