ととshell_exec()
一緒に提案します。escapeshellcmd()
escapeshellarg()
明確にするために(この回答を最初に投稿したとき、私は外出していました):シェルコマンドを保護する正しい方法は次のとおりです。
$exe = 'cat';
$args = array('/etc/passwd');
$args = array_map('escapeshellarg', $args);
$escaped = escapeshellcmd($exe . ' ' . implode(' ', $args));
これは、上記のコードの正当なデモ(悪質なデモも) です。
もちろん、上記は単なるダミーの例です。ただし、主な考え方は、各引数に適用してから、コマンド文字列全体 (実行可能ファイルへのパスと以前にエスケープされた引数を含む) をescapeshellarg()
呼び出すことです。escapeshellcmd()
これは、任意のコマンドでは重要です。
注: secureとは、、、などの特別な意味を持つ文字 (ウィキペディアのリンクを参照) をエスケープすることにより、シェル インジェクション攻撃を実行できないようにすると同時に、スペースやその他の特別な意味を持つ可能性のある文字を適切に引用することを意味します。シェルによる解釈。>
<
&&
|
それはさておき、許可されているすべてのコマンドをすでにホワイトリストに登録している場合は、すでに可能な限り最高のセキュリティを備えており、上記の機能は必要ありません (とにかく使用しても害はありません)。
実際の呼び出し関数に関しては、いくつかの癖がありますが、ほとんど同じことを行います。個人的にはshell_exec()
、戻り値がより用途が広いため、私は好みます (このページから):
- exec() : コマンドからの出力の最後の行を返し、何もフラッシュしません。
- shell_exec() : コマンドからの出力全体を返し、何もフラッシュしません。
- system() : コマンドからの出力の最後の行を返し、出力の各行の後に出力バッファーをフラッシュしようとします。
- passthru() : 何も返さず、ブラウザに干渉することなく結果の出力を渡します。特に、出力がバイナリ形式の場合に役立ちます。
system()
終了戻りコードを除いて、戻り値が の他のすべての関数の動作を模倣できますshell_exec()
。ただし、逆に実行するのは難しいか、不可能です。
これで問題が解決することを願っています。