Risposta breve: LINQ non è vulnerabile a SQL injection.
Risposta lunga:
LINQ non è come SQL. C'è un'intera libreria dietro le quinte che costruisce SQL dagli alberi di espressione generati dal compilatore dal tuo codice, mappando i risultati agli oggetti, e ovviamente si occupa di rendere le cose sicure lungo la strada.
Vedi LINQ to SQL FAQ:
D. Come è LINQ to SQL protetto dallo attacchi SQL-injection?
A. L'SQL injection ha rappresentato un rischio significativo per le query SQL tradizionali formate da concatenazione dell'input dell'utente . LINQ to SQL evita tale iniezione utilizzando SqlParameter nelle query . L'input dell'utente viene convertito nei valori dei parametri . Questo approccio impedisce l'utilizzo di comandi dannosi dall'input del cliente.
Internamente, significa che quando LINQ to SQL interroga il database, invece di utilizzare i valori semplici, che passa come parametri SQL, che significa che possono mai essere trattati come codice eseguibile dal database.Questo vale anche per la maggior parte (se non tutti) i mappatori ORM là fuori.
confrontare questi due approcci (totalmente pseudo-codice):
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
vi consiglio di immergersi in quello che le dichiarazioni LINQ realtà significa e quando e come essi vengono tradotti al reale SQL. Si consiglia di conoscere LINQ standard query operator translation, deferred execution, different LINQ providers e così via. In caso di LINQ, proprio come qualsiasi altra tecnologia di astrazione, è allo stesso tempo affascinante e incredibilmente utile sapere cosa succede dietro le quinte.
P.S. Ogni volta che vedo una domanda su SQL injection non posso fare a meno di ricordare questo webcomic.
fonte
2010-09-29 20:57:32
mettere quello in un blocco preventivo invece di un blocco di codice – msarchet
Sì, mancava il pulsante. Grazie per la segnalazione. –
Tuttavia, se si utilizza Linq per concatenare string e input, è ancora possibile essere vulnerabili. – Oded