PHP - Harici komutunu çalıştırın, ancak bir dizi geçerek, program adı için bir, daha sonra arg2, vb arg1

2 Cevap php

Ben adlarında boşluk var dosyalar üzerinde çalışacak programları çalıştırmak için gereken bir PHP komut dosyası var. Dış komutları çalıştırmak için en PHP fonksiyonları (örneğin, exec()) yürütmek için komut satırı için bir 1 dize argüman alabilir. Ancak o zaman giriş güvenli hale getirmek için escapeshellarg() gibi şeyler yapmak zorunda.

Bir dizi PHP ile harici bir komutu çalıştırmak için bazı yolu var mı. Yani ziyade:

exec("ls -l ".escapeshellarg($filename));

Ben gidebilir:

exec(array("ls", "-l", $filename));

Bu benim argümanları kaçan hakkında endişelenmenize gerek yok anlamına gelir. Ben kullanıyorum versiyon ASCII olmayan karakterleri çıkarır bir hata vardır beri, escapeshellarg() kullanmaktan kaçınmak istiyorum.

Java http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html # exec% 28java.lang.String []% 29 bu işlevselliği vardır

2 Cevap

Bu PHP'nin yerleşik fonksiyonları ile mümkün değildir gibi geliyor.

Poke cevabı iyi - ancak onlar çalıştırmak için kaç komutları gerekiyor? Ben komutları ve argümanları bir beyaz liste uygulanması hakkında düşünürdüm - yolu, onlar enjeksiyon kötü niyetli giriş değil lanetlemek oldukça emin olabilirsiniz. Gibi bir şey:

$whitelistCommandArray = array('ls' => 'ls', ...);
if (isset($whitelistCommandArray[$userSuppliedCommand]])
{
    //ok its a valid command, lets parse the args next
    ...
}
else echo "Unsupported command";

Güncelleme / düzenleme:

Is a whitelist of arguments feasible? What if OP needs to edit a multitude of files? – Matchu

heh ben bilmiyorum - bu olabilir - tamamen sizin ihtiyaçlarınıza bağlıdır.

$whitelistArray = array('ls' => array('a', 'l', 'h'), ...);

Bu işin böyle bir şey - komuta ve bunun için argümanlar daha sonra bir dizi hem de.