Prevenire gli attacchi SQL injection

di Daniele Bochicchio, in Classic ASP, Database, Tips,

E' notizia di qualche giorno fa che una delle versioni della celeberrima applicazione AdMentor conteneva un "bug" in grado di entrare con privilegi di amministratore.
Ovviamente si tratta di un errore di design dell'applicazione stessa.
AdMentor autentica gli utenti tramite una stringa come la seguente:

SQL = "SELECT * FROM users WHERE ID='" & Request("ID") & "' AND password='" & Request("password") & "'"

basta inserire "' OR ''='" come userID e password per ritrovarsi una stirnga SQL così formattata:

SQL = "SELECT * FROM users WHERE ID='' OR ''='' AND password='' OR ''=''"

che avrà come effette quello di farci entrare nell'area riservata, perchè di fatto estrae tutti i record dalla nostra tabella.
Per ovviare a questo genere di problemi, sarebbe opportuno predisporre funzionalità che intercettino i caratteri non leciti, sostiutendoli o rendendelo inoffensivi.
Come prima regola, è sufficiente intercettare e raddoppiare tutti gli apici ('), in questo modo:

SQL = "SELECT * FROM users WHERE ID='" & Replace(Request("ID"), "'", "''") & "' AND password='" & Replace(Request("password"), "'", "''") & "'"

A questo punto avremo una stringa SQL di questo tipo:

SQL = "SELECT * FROM users WHERE ID=''' OR ''''='''' AND password=''' OR ''''='''"

Altro potenziale errore è quello di prendere direttamente un valore numerico e passarlo in pasto alla query: in questo caso è possibile passare un comando al database, semplicemente passando qualcosa come "140 ; DELETE FROM nometabella".
La prima regola è dunque quella di controllare sempre l'input dell'utente, senza passarlo direttamente al database.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi