Progettazione… Programmazione… Soluzione…
Difesa contro l’SQL Injection
Nel precedente articolo vi ho descritto la tecnica dell’SQL Injection, la sua pericolosità e le sue potenzialità. Ora, vediamo come è possibile adottare opportuni accorgimenti per difenderci contro questo attacco.
La tecnica dell’SQL Injection nasce dal fatto che è possibile introdurre codice malevolo all’interno di normali campi di testo. Evitare ciò non è di solito possibile, però è sicuramente possibile (quasi doveroso) effettuare un controllo sui dati che l’utente immette in questi campi. Vediamo di seguito un paio di tecniche che è possibile adottare per rendere innocui anche i tentativi maliziosi.
Magic Quotes
Nelle impostazioni di PHP, ce n’è una adatta al caso nostro. Si tratta del flag magic_quotes_gpc presente nel file di configurazione php.ini. Abilitando questo flag, si è garantiti che tutti i dati ricevuto tramite GET, POST e COOKIE saranno automaticamente controllati, ed eventualmente convertiti, prima di essere usati nei vostri script PHP. Vedete quindi, che con un semplice passaggio, si è assolutamente protetti contro ogni tipo di attacco SQL Injection. Di seguito la porzione del file php.ini relativa a questa funzione.
1 2 3 4 5 6 7 8 | ; Magic quotes ; ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = On ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off ; Use Sybase-style magic quotes (escape ' with '' instead of \'). magic_quotes_sybase = Off |
Tuttavia, molti servizi di hosting hanno di default questo flag ad OFF, con l’impossibilità di impostarlo su ON. Quando accade ciò, bisognerà fare manualmente, in fase di programmazione, il controllo di tutti i dati ottenuti dall’esterno, ed eventualmente la conversione dei caratteri speciali. Questo è di norma ciò che accade, e vediamo come è possibile realizzarlo.
Escape dei caratteri speciali
Quando si compongono query SQL usando dati forniti dall’utente, è sempre opportuno convertire i caratteri speciali presenti in questi dati, in caratteri innocui per il database SQL. Ad esempio, la stringa l’attacco se inserita così come è in una query SQL, causerà un errore dovuto alla presenza del carattere ‘ (apice singolo). Effettuando un escape dei caratteri speciali, la stringa sarà convertita in l\’attacco, e quindi il carattere ‘ non sarà più pericoloso, perchè il motore SQL interpreta la sequenza \’ come un unico carattere, che non sarà confuso con il carattere ‘.
In PHP questo è possibile attraverso la funzione mysql_real_escape_string($stringa_pericolosa). Questa funzione effettua esattamente i controlli precedentemente illustrati e le relative sostituzioni, non solo per il carattere ‘ (apice singolo) ma per tutti i caratteri speciali ritenuti pericolosi. L’utilizzo di questa funzione è altamente raccomandato su tutti i dati ricevuti da un utente esterno, proprio per evitare l’introduzione di codice malevolo all’interno delle proprie applicazioni.
PHP Manual: mysql_real_escape_string
Con questo articolo spero di aver chiarito l’introduzione all’SQL Injection fatta nel precedente articolo, e di avervi convinto a progettare bene fin dall’inizio il codice delle vostre applicazioni.
| Stampa l'articolo | Questo articolo è stato pubblicato da nerthase il 22 marzo 2010 alle 22:48, ed è archiviato come Guide, Informatica & co, PHP & MySql. Puoi seguire i commenti a questo post attraverso RSS 2.0. Puoi pubblicare un commento o segnalare un trackback dal tuo sito. |





