function fs_escapeshellarg($path)
{
if (strpos($path, ' ')) return "\"$path\"";
return $path;
}
これは不十分な実装でしたね.当方の環境(Windows + fs_moodle)で外部zipコマンドを利用して'+'や'&'をファイル名に含むファイルやフォルダを引数としてzip書庫の作成を行うと失敗する現象が確認されました.なんでかんでもダブルクウォートで括るという選択肢もあったのですが,そこをケチったのがいけなかったのか? いまのところは,
function fs_escapeshellarg($path)
{
if (strpos($path, ' ')) return "\"$path\"";
if (strpos($path, '+')) return "\"$path\"";
if (strpos($path, '&')) return "\"$path\"";
return $path;
}
という消極的な対策(ファイル名にダブルクウォートは許していないので)で改善しましたが,どうしたものでしょうか.
http://php.plus-server.net/function.escapeshellcmd.html
escapeshellarg()の説明ではあまり詳しく書かれていなかったので.%を半角スペースに置き換える操作はescapeshellarg()でも行っていることを確認しました.でも,それをやると今度は%をファイル名に含むファイル名を引数に渡して正しく動かないと思うのですけれども...?