Proteggere PHP dai comandi di sistema

25 giugno 2010

Le funzioni per l’escaping dei comandi di sistema

escapeshellarg

escapeshellarg() è stata concepita per effettuare l’escape (o “quoting” o più semplicemente “delimitazione tra apici”) di una stringa da utilizzare come argomento per un istruzione da inviare tramite shell; in pratica questa funzione non fa altro che aggiungere dei singoli apici all’inizio e alla fine di una stringa e consente di effettuare l’escape di eventuali apici singoli preesistenti, in questo modo l’utilizzatore avrà la possibilità di passare una stringa resa sicura direttamente ad un’istruzione da inviare tramite terminale. Utilizzare escapeshellarg() è molto semplice:

<?php
// $_POST['cartella'] = '/var/www/website';
$cartella = $_POST['cartella'];
system('ls -t '.escapeshellarg($cartella));
?>

Nell’esempio proposto, il contenuto della variabile $cartella verrà concatenato al comando ls -t all’interno dell’istruzione dopo l’escape operato dalla funzione escapeshellarg(), in modo che esso risulti sicuro nel momento in cui viene passato a system().

escapeshellcmd

escapeshellcmd() ha invece un compito diverso, essa infatti è stata concepita per effettuare l’escape dei metacaratteri (caratteri che in una stringa rappresentano insiemi di altri caratteri o anche delle sequenze di caratteri) da un parametro utilizzabile come argomento per un’istruzione da terminale. In pratica si tratta di una funzione che effettua l’escape di qualsiasi carattere presente in una stringa che possa essere utilizzato per alterare l’esecuzione di un’istruzione introducendo comandi arbitrari.

Anche l’utilizzo di questa funzione è estremamente semplice:

<?php
// $_POST['sorgente'] = '/home/immagini_2009';
// $_POST['destinazione'] = '/home/archivo/immagini';
$sorgente = $_POST['sorgente'];
$destinazione = $_POST['destinazione'];
$istruzione = exec(escapeshellcmd('cp -r '. $sorgente . ' ' . $destinazione'));
?>

Nell’esempio proposto, tutti i parametri inviati tramite input dell’utente subiscono il quoting dovuto alla funzione escapeshellcmd() prima di essere passati come argomenti a exec() ed entrare quindi a far parte dell’istruzione da terminale.

Conclusioni

In questa breve trattazione sono state fornite alcune indicazioni sui rischi derivanti dall’esecuzione di comandi di sistema tramite PHP, inoltre, sono state proposte le funzioni essenziali per limitare i pericoli derivanti da questo tipo di istruzioni, ponendo particolare attenzione ai costrutti che consentono di effettuare l’escape degli input inviati dagli utenti.

Se vuoi aggiornamenti su Proteggere PHP dai comandi di sistema inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Proteggere PHP dai comandi di sistema

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy