Prevenire l'Sql Injection in ASP.NET
Data di pubblicazione: 01/07/2003
Voto della community: 3,83
(Votanti: 6)
Con Sql Injection si intende l'inserimento, da parte di un utente, di codice SQL 'malizioso' all'interno di un comando SQL; cio' è possibile quando il comando SQL viene costruito a partire da una stringa che comprende parametri ricevuti dall'esterno (ad esempio il testo di una TextBox) e non vengono effettuati opportuni controlli sugli stessi. Tale vulnerabilità esiste sia quando il parametro atteso è di tipo numerico sia quando questo è di tipo non numerico. Se infatti il parametro atteso è numerico, avremmo una stringa sql tipo: string miasql = "SELECT COUNT(*) FROM utenti WHERE codicesegreto=" + TextBox1.Text
che puo' essere facilmente alterata in modo da ottenere, ad esempio: SELECT COUNT(*) FROM utenti WHERE codicesegreto=0 OR 1=1 se solo l'utente inserisse come input: 0 OR 1=1 Se il parametro atteso è invece alfanumerico, la stringa sql assomiglierebbe a: string miasql = "SELECT COUNT(*) FROM utenti WHERE password_utente='" + TextBox1.Text + "'"
In questo caso basterebbe inserire come input un apice seguito da altro codice sql perché quest'ultimo venga "interpretato" e non più considerato come parte del parametro; ad esempio l'input:
' OR 1=1 -- produrrebbe la query: SELECT COUNT(*) FROM utenti WHERE password_utente='' OR 1=1 In entrambi i casi la query risultante riporterà un numero positivo di record (ovvero il numero totale dei record presenti poiché la condizione nell'OR è soddisfatta per tutti i record) cosa che è probabilmente sufficiente per ottenere l'autenticazione senza che si conosca il codice/password. Utenti più smaliziati potrebbero inserire codice più dannoso e in grado di alterare query più complesse, sfruttando sempre tale tecnica. In ASP.NET è possibile evitare l'sql injection senza dover ricorrere a controlli di validità sui parametri passati, inserendo questi ultimi nella collezione dei parametri dell'oggetto Command. In questo modo infatti i parametri sono trattati letteralmente, senza possibilità quindi che vengano interpretati come codice SQL. Ad esempio, la query iniziale puo' essere riscritta come:
// query con SqlCommand
Se avessimo invece racchiuso la query in una stored procedure mia_stored_procedure, passeremo il parametro sempre aggiungendolo alla collezione dei parametri dell'oggetto Command:
// stored procedure con SqlCommand
|
||||||||||||||||||||||||