1

str_replace()PHP でシェル コマンドを作成しようとしているときに、関数に問題が発生しました。シェルでは、スペースを含む行をタブで終了すると、次のようになります。

tar cvfz destination/filename.zip source/Name\ Of\ The\+\ Folder

したがって、これは、このコマンドを 経由exec()で実行するには、PHP の文字列に含まれるスペースをすべて置き換える必要があることを示しています。この問題を解決するために、私は使用しています

$q = str_replace(' ', '\ ' , $q);

スペースを「」ではなく「\」にフォーマットするために、文字列解析の開始時に。私が抱えている問題は、この特定のフォルダーでは、プラス記号も削除され、次のようにフォーマットされることです。

tar cvfz destination/Name\ Of\ The\ \ \ Folder.tgz source/Name\ Of\ The\ \ \ Folder

str_replace()プラス記号を削除しないように設定するにはどうすればよいですか? これまでの私の限られたテストから、これらから何も削除されていません:-, %, @, !, (, *, ), ^, =

4

1 に答える 1

3

これに文字列関数を使用することは非常に間違っており、セキュリティ ホールが大きく開いたままになる可能性があります。

PHPには、escapeshellarg()必要なことを正確に実行するという関数があります。

escapeshellarg()文字列を一重引用符で囲み、既存の一重引用符を引用/エスケープすることで、文字列をシェル関数に直接渡し、それを単一の安全な引数として扱うことができます。この関数は、ユーザー入力からのシェル関数への個々の引数をエスケープするために使用する必要があります。

于 2012-08-12T21:17:56.753 に答える