Question

J'ai un script PHP qui a besoin pour exécuter des programmes qui fonctionnent sur les fichiers qui ont des espaces dans les noms. La plupart des fonctions PHP pour exécuter des commandes externes (par exemple exec()) prennent un argument de chaîne pour une ligne de commande à exécuter. Cependant, vous devez faire des choses comme escapeshellarg() pour faire votre entrée en toute sécurité.

Est-il possible d'exécuter une commande externe en PHP avec un tableau. Ainsi, plutôt que:

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

Je peux aller:

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

Cela signifie que je n'ai pas à vous soucier d'échapper aux arguments. Je veux éviter d'utiliser escapeshellarg(), puisque la version que je me sers a un bug qui exclut les caractères non-ASCII.

Java a cette fonctionnalité http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String []% 29

Était-ce utile?

La solution

Sons comme cela est impossible avec les fonctions intégrées de PHP.

Autres conseils

function myExec ( command, arguments )
{
    exec( command + ' ' + implode( ' ', array_map( escapeshellarg, arguments ) ) );
}

La réponse de Poke est bonne - cependant, combien de commandes ont-ils besoin d'exécuter? Je pense à propos de la mise en œuvre d'une liste blanche des commandes et des arguments - de cette façon, vous pouvez être sacrément sûr qu'ils ne sont pas une injection entrée malveillante. Quelque chose comme:

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

Mise à jour / edit:

  

est une liste blanche des arguments réalisables?   Que faire si OP doit modifier une multitude   des fichiers? - Matchu

heh Je ne sais pas - il pourrait être - tout dépend de vos besoins

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

Quelque chose comme ce travail -. À la fois la commande puis un tableau d'arguments pour elle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top