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 に答える