Escaping php 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:
// $_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:
// $_POST['sorgente'] = '/home/immagini_2009';
// $_POST['destinazione'] = '/home/archivo/immagini';
$sorgente = $_POST['sorgente'];
$destinazione = $_POST['destinazione'];
$i= 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.