2

我有一个 PHP 脚本,它需要执行将在名称中包含空格的文件上运行的程序。大多数用于执行外部命令(例如exec())的 PHP 函数采用 1 个字符串参数来执行命令行。但是,您必须做一些事情,例如escapeshellarg()确保您的输入安全。

有没有办法在 PHP 中使用数组执行外部命令。所以而不是:

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

我可以去:

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

这意味着我不必担心逃避争论。我想避免使用escapeshellarg(),因为我使用的版本有一个错误,它会去除非 ASCII 字符。

Java 有这个功能http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String[]%29

4

3 回答 3

2

听起来这对于 PHP 的内置函数是不可能的。

于 2010-02-01T15:06:03.467 回答
1
function myExec ( command, arguments )
{
    exec( command + ' ' + implode( ' ', array_map( escapeshellarg, arguments ) ) );
}
于 2010-01-23T18:04:03.560 回答
-1

Poke 的回答很好——但是,他们需要运行多少个命令?我会考虑实现一个命令和参数的白名单——这样,你可以非常确定它们不是注入恶意输入。就像是:

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

更新/编辑:

参数白名单是否可行?如果 OP 需要编辑大量文件怎么办?– 抹茶

呵呵,我不知道——它可能——完全取决于你的需要。

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

类似的工作 - 使用命令和一组参数。

于 2010-01-23T18:26:53.283 回答