Sicurezza in PHP – SQL injections

Cos’è un SQL injection ?

Direttamente da html.it

la SQL injection consiste nell’inserimento di query T-SQL e nella modifica di interrogazioni già esistenti nelle pagine dinamiche, così da far compiere all’applicazione un’azione del tutto imprevista.

Un altra buona definizione direttamente da wikipedia

La SQL injection è una tecnica dell’hacking mirata a colpire le applicazioni web che si appoggiano su un database di tipo SQL. Questo exploit sfrutta l’inefficienza dei controlli sui dati ricevuti in input ed inserisce codice maligno all’interno di una query SQL. Le conseguenze prodotte sono imprevedibili per il programmatore: l’Sql Injection permette al malintezionato di autenticarsi con ampi privilegi in aree protette del sito (ovviamente, anche senza essere in possesso delle credenziali d’accesso) e di visualizzare e/o alterare dati sensibili.

Soluzioni

– Non fidarsi dell’input dell’utente. Mai. Anche un utente che commette un errore , e non un malintenzionato, può provocare danni.

– Eseguire sempre l’escape dei caratteri utilizzando mysql_real_escape_string() oppure addslashes()

– Controllare la direttiva di PHP magic_quotes_gpc. Se impostata su ON non eseguire l’escape in quanto viene fatto automaticamente e procurerebbe solo un escape multiplo.

– Se stiamo ricevendo un email da un form , controlliamo che sia valida (esistono molte funzioni in giro).

– Stiamo ricevendo un dato e ci aspettiamo che sia un numero? Eseguiamo il casting (int)$_POST[‘input_utente’]

Approfondisci

Sicurezza in PHP – register_globals

Cos’è la direttiva register_globals di php ?

Direttamente da phpnews.it

Se nel php.ini è abilitata la direttiva register_globals il PHP crea automaticamente, all’avvio di ogni script, delle variabili globali con i dati provenienti dall’URL, dai form, dai cookies, dalla sessione, dal server web e dal browser.

E’ chiaro che questa situazione rende la nostra vita più semplice in fase di programmazione, ma è anche vero che se non inizializziamo tutte le variabili, un malintenzionato (o anche un erorre perchè no ..) potrebbe scrivere nell’url della nostra pagina &variabile=1 e settare in questo modo una variabile che nel nostro codice potrebbe servire a molte cose… nel peggiore dei casi ad un autentificazione.

Brutta situazione vero? Da PHP 4.2 in su infatti la direttiva è stata portata di default da ON a OFF obbligandoci quindi a scrivere codice più ragionato , e quindi più sicuro.

Soluzioni

Una buona abitudine, indipendentemente dalla direttiva register_globals è inizializzare e definire SEMPRE le variabili che andremo ad usare nel nostro script.

Secondariamente bisogna impostare la direttiva register_globals ad OFF in questo modo :

Direttamente da php.ini : register_globals = false

Nel file .htaccess del nostro sito : php_flag register_globals off

Approfondimento su register_globals (inglese) : php.net http://it.php.net/register_globals

Approfondisci