Exécuter une commande externe en passant un tableau, avec des espaces de noms de fichiers
-
22-09-2019 - |
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
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