ExecuteCommand di LINQ fornisce protezione dagli attacchi di iniezione SQL?
-
03-07-2019 - |
Domanda
Ho una situazione in cui devo usare il metodo ExecuteCommand di LINQ per eseguire un inserimento.
Qualcosa di simile (semplificato ai fini di questa domanda):
object[] oParams = { Guid.NewGuid(), rec.WebMethodID };
TransLogDataContext.ExecuteCommand (
"INSERT INTO dbo.Transaction_Log (ID, WebMethodID) VALUES ({0}, {1})",
oParams);
La domanda è se questo è a prova di iniezione SQL allo stesso modo delle query con parametri?
Soluzione
Ho fatto qualche ricerca e ho trovato questo:
Nel mio semplice test, sembra i parametri passati in ExecuteQuery ed ExecuteCommand i metodi vengono automaticamente codificati in SQL in base al valore fornito. Così se passi una stringa con un ' carattere, verrà automaticamente SQL sfuggire a ''. Credo un simile la politica viene utilizzata per altri tipi di dati come DateTimes, Decimals, ecc.
http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
(Scorri verso il basso per trovarlo)
Questo mi sembra un po 'strano - la maggior parte degli altri strumenti .Net lo sanno meglio di "quotare SQL escape" nulla; usano invece parametri di query reali.
Altri suggerimenti
LINQ to SQL utilizza exec_sql con parametri, che è molto più sicuro rispetto alla concatenazione nella stringa di query ad hoc. Dovrebbe essere altrettanto sicuro nell'iniezione di SQL rispetto all'utilizzo di SqlCommand e della sua raccolta Paramaters (in effetti, è probabilmente ciò che LINQ to SQL utilizza internamente). Inoltre, quanto è sicuro che ?