Genellikle, güvenli bir kabuk komutu tek bir argüman yaparak, escapeshellarg
a> kullanmak isteyeceksiniz. İşte sebebi:
Bir dizindeki dosyaların bir listesini almak gerekiyor herhalde. Aşağıdaki ile geldi:
$path = 'path/to/directory'; // From user input
$files = shell_exec('ls '.$path);
// Executes `ls path/to/directory`
(This is a bad way of doing this, but for illustration bear with me)
Bu, bu yol için "büyük" çalışıyor, ancak verilen yol daha tehlikeli bir şey olduğunu varsayalım:
$path = 'path; rm -rf /';
$files = shell_exec('ls '.$path);
// Executes `ls path`, then `rm -rf /`;
Verilen yol unsanitised kullanılan çünkü, herhangi bir komut potansiyel çalıştırılabilir. Biz bunu önlemek için denemek için escapeshell*
yöntemlerini kullanabilirsiniz.
İlk olarak, kullanarak escapeshellcmd
a>:
$path = 'path; rm -rf /';
$files = shell_exec(escapeshellcmd('ls '.$path));
// Executes `ls path\; rm -rf /`;
Bu büyük bir güvenlik riski durur iken, yine birden fazla parametre içeri geçirilen yol açabilir bu nedenle bu yöntem sadece, birden fazla komutları çalıştırarak yol açabilir karakterleri kaçar
Şimdi kullanarak espaceshellarg
a>:
$path = 'path; rm -rf /';
$files = shell_exec('ls '.escapeshellarg($path));
// Executes `ls 'path; rm -rf /'`;
Bu bize istediğimiz sonucu verir. Bunu tüm argümanı alıntı fark edeceksiniz, böylece vb bireysel alanlarda, kaçtı olması gerekmez. Argümanı tırnak kendisi sahip olsaydı, onlar olacağını aktardı.
escapeshellarg
güvenli bir dize bir komuta tek bir argüman olarak kullanmak için yapar iken özetlemek, escapeshellcmd
, emin bir dize sadece tek bir komut yapar.