asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 5988
ASPCode.it - Store

  > > Articoli

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
SqlCommand Cmd = new SqlCommand ("SELECT * from utenti where codicenumerico=@mio_param",MyConn);   
Cmd.Parameters.Add(new SqlParameter("@mio_param", TextBox1.Text));


// query con OleDbCommand
OleDbCommand Cmd = new OleDbCommand ("SELECT * from utenti where codicenumerico=?", MyConn);   
Cmd.Parameters.Add(new OleDbParameter("@mio_param", TextBox1.Text));

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
SqlCommand Cmd = new SqlCommand ("mia_stored_procedure",Myconn);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add(new SqlParameter("@mio_param", TextBox1.Text));


// stored procedure con OleDbCommand

OleDbCommand Cmd = new OleDbCommand ("mia_stored_procedure",Myconn);
Cmd.CommandType = CommandType.StoredProcedure;
Cmd.Parameters.Add(new OleDbParameter("@mio_param", TextBox1.Text));




Utenti connessi: 5988