Stiamo avendo un'altra discussione qui al lavoro sull'utilizzo di query sql parametrizzate nel nostro codice. Abbiamo due lati nella discussione: io e alcuni altri che dicono che dovremmo sempre usare i parametri per proteggerci dalle iniezioni sql e gli altri ragazzi che non pensano che sia necessario. Vogliono invece sostituire singoli apostrofi con due apostrofi in tutte le stringhe per evitare iniezioni sql. I nostri database eseguono tutti Sql Server 2005 o 2008 e la nostra base di codice gira su .NET framework 2.0.
Lascia che ti faccia un semplice esempio in C #:
Voglio che usiamo questo:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
Mentre gli altri ragazzi vogliono farlo:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
Dove la funzione SafeDBString è definita come segue:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
Ora, finché utilizziamo SafeDBString su tutti i valori di stringa nelle nostre query, dovremmo essere al sicuro. Destra?
Esistono due motivi per utilizzare la funzione SafeDBString. In primo luogo, è il modo in cui è stato fatto dall'età della pietra e, in secondo luogo, è più facile eseguire il debug delle istruzioni sql poiché si vede la query esatta eseguita sul database.
Allora. La mia domanda è se sia davvero sufficiente utilizzare la funzione SafeDBString per evitare attacchi di sql injection. Ho cercato di trovare esempi di codice che infrangono questa misura di sicurezza, ma non riesco a trovarne alcun esempio.
C'è qualcuno là fuori che può rompere questo? Come lo faresti?
EDIT: per riassumere le risposte finora:
- Nessuno ha ancora trovato un modo per aggirare SafeDBString su Sql Server 2005 o 2008. Va bene, credo?
- Diverse risposte hanno sottolineato che si ottiene un miglioramento delle prestazioni quando si utilizzano query parametrizzate. Il motivo è che i piani di query possono essere riutilizzati.
- Siamo anche d'accordo sul fatto che l'utilizzo di query parametrizzate fornisca un codice più leggibile e più facile da mantenere
- Inoltre è più facile utilizzare sempre i parametri che utilizzare varie versioni di SafeDBString, conversioni da stringa a numero e conversioni da stringa a data.
- Utilizzando i parametri si ottiene la conversione automatica del tipo, cosa particolarmente utile quando si lavora con date o numeri decimali.
- E infine: non cercare di proteggerti da solo come ha scritto JulianR. I fornitori di database dedicano molto tempo e denaro alla sicurezza. Non c'è modo in cui possiamo fare di meglio e non c'è motivo per cui dovremmo provare a fare il loro lavoro.
Quindi, anche se nessuno è stato in grado di violare la semplice sicurezza della funzione SafeDBString, ho ricevuto molti altri buoni argomenti. Grazie!