Escapeshellarg ve escapeshellcmd arasındaki fark nedir?

3 Cevap php

PHP 2 yakından ilgili işlevleri, escapeshellarg() and escapeshellcmd() . They both seem to do similar things, namely help make a string safer to use in system() / exec() / vb vardır

Hangisini kullanmalıyım? Ben sadece her şeyi havaya uçurmak bazı kullanıcı girişi almak ve bunun üzerine bir komutu çalıştırmak değil, muktedir istiyorum. PHP kabuk atlar (argv) gibi dizeleri bir dizi aldı, bir exec-tipi-fonksiyonu olsaydı, ben o kullanmak istiyorum. Python subprocess.call() işlevine benzer.

3 Cevap

Dan http://ie2.php.net/manual/en/function.escapeshellarg.php

escapeshellarg() adds single quotes around a string and quotes/escapes any existing single quotes allowing you to pass a string directly to a shell function and having it be treated as a single safe argument.

escapeshellarg, adından da anlaşılacağı gibi, kabuk argüman (lar) olarak geçen kullanılır. Örneğin, geçerli dizini listelemek istiyorum,

$dir = ".";
system('ls '.escapeshellarg($dir));
escapeshellcmd('ls $dir');

Her ikisi de benzer şeyler yapmak ve sadece size mantığı üstesinden nasıl bağlıdır, sizin normalize emin olun ve daha iyi güvenlik için bu yöntemlerin doğrudan geçirmeden önce girişini doğrulamak yok.

Genellikle, güvenli bir kabuk komutu tek bir argüman yaparak, escapeshellarg 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 :

$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 :

$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.

PHP dokümanlar farkı heceleyerek:

escapeshellcmd:

Following characters are preceded by a backslash: #&;`|*?~<>^()[]{}$\, \x0A and \xFF. ' and " are escaped only if they are not paired. In Windows, all these characters plus % are replaced by a space instead.

escapeshellarg:

adds single quotes around a string and quotes/escapes any existing single quotes allowing you to pass a string directly to a shell function and having it be treated as a single safe argument.

Source:

http://www.php.net/manual/en/function.escapeshellcmd.php http://www.php.net/manual/en/function.escapeshellarg.php