Prevenire il SQL Injection

Settimana scorsa ho scritto il primo di una serie di tutorial inerenti all’elemento HTML5 canvas. Un ibrido tra il web design e il web development. Oggi, invece, ti parlerò di sicurezza informatica e PHP, uno dei topic più discussi e meno applicati della storia del web. In particolare ti spiegherò come prevenire il SQL Injection.

A chi non è capitato di tralasciare il fattore sicurezza su uno dei propri programmi, sopratutto nei mesi di apprendimento? Io all’inizio facevo dei veri e propri gruviera in termini di sicurezza e se anche tu eri o sei nella mia stessa situazione, beh non siamo soli. Dopo il problematico HearthBleed è stato condotto uno studio il quale riporta che il 65% di coloro che hanno partecipato al sondaggio hanno avuto a che fare con attacchi di SQL Injection. Un numero troppo elevato per essere un problema arci noto.

Cos’è il SQL Injection?

Il SQL Injection è una tecnica molto diffusa di hacking, la quale mira a colpire quei siti web che si appoggiano su un DBMS di tipo SQL.

L’attacco si basa principalmente sugli input dell’utente, il quale potrebbe inserire del codice maligno all’interno di una query. Gli effetti sono imprevedibili, ad esempio il cracker potrebbe autenticarsi con privilegi uguali ai vostri se non addirittura superiori e alterare di conseguenza i dati sensibili all’interno del DB.

Di seguito riporto due tipologie di attacchi SQL Injection uno più infame dell’altro, ma non ti preoccupare alla fine ti spiegherò come prevenire il SQL Injection.

Scaramucce con il SQL Injection?

La dinamica è la seguente:

il nostro utente con username gigi deve accedere all’area riservata del sito dove lo attende un succulento download di freebies. Cosa accade se l’utente gigi ha cattive intenzioni?

Il risultato sarà il seguente:

Come avrai già capito nella query normale non ci sono problemi, MySQL selezionerà tutti i record che hanno come username gigi.

Con la query infetta di problemi ce ne sono eccome. Tramite l’utilizzo della virgoletta singola chiude la parte relativa allo username e aggiunge la condizione OR 1 alla clausola WHERE la quale risulterà sempre vera.

Risultando sempre vera la condizione OR 1 permetterà al malintenzionato di selezionare ogni singola entry del DB.

I demoni conoscono il SQL Injection

Nell’esempio precedente l’attaccante ha la possibile di avere accesso ad un sacco di informazioni che non dovrebbe avere e creerebbe non pochi problemi.

Ora supponiamo che sia il nostro giorno sfortunato e si verifica un attacco ancora più pesante di SQL Injection eseguito con l’intento di cancellare ogni record della tabella, di seguito il codice:

Il risultato è:

Se esegui questa query (ti sconsiglio di farlo nella maniera più categorica) il risultato sarebbe la cancellazione di tutti i record della tabella utenti.

Come puoi vedere è un problema davvero serio, quindi come puoi prevenire il SQL Injection?

Prevenire il SQL Injection efficacemente

Fortunatamente il problema è conosciuto e PHP ha dedicato una funzione apposita per prevenire il SQL Injection. Attaccare con il SQL Injection è tanto semplice quanto risolverlo grazie alla funzione mysql_real_escape_string.

Questa miracolosa funzione aggiunge le sequenze di escape ai caratteri speciali di una stringa. Per comprendere maggiormente l’utilizzo è meglio vederla in azione

Il risultato sarà il seguente:

Il backslash è la nostra salvezza quando si tratta di prevenire il SQL Injection.

Dopo questo tutorial non hai più scuse, implementa subito la funzione per prevenire il SQL Injection e proteggi i dati nelle tue tabelle. Però prima condividi e fai sapere a tutti quanto è facile proteggere dai dispettosi cracker.