array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'ja', ), 'this' => array ( 0 => 'function.escapeshellcmd.php', 1 => 'escapeshellcmd', ), 'up' => array ( 0 => 'ref.exec.php', 1 => 'プログラム実行関数', ), 'prev' => array ( 0 => 'function.escapeshellarg.php', 1 => 'escapeshellarg', ), 'next' => array ( 0 => 'function.exec.php', 1 => 'exec', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'ja', 'path' => 'reference/exec/functions/escapeshellcmd.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
(PHP 4, PHP 5, PHP 7, PHP 8)
escapeshellcmd — シェルのメタ文字をエスケープする
escapeshellcmd() は、文字列中においてシェルコマンドを だまして勝手なコマンドを実行する可能性がある文字をエスケープします。 この関数は、ユーザーに入力されたデータを関数 exec() または system() または、 バッククォート演算子 に渡す前に全てエスケープを行う場合に使用するべきです。
&#;`|*?~<>^()[]{}$\
、\x0A
および \xFF
については、その文字の前にバックスラッシュが
追加されます。'
および "
は、対になっていない場合にのみエスケープされます。
Windows では、
これらの文字に加えて %
と !
の前にキャレット
(^
) が付加されます。
command
エスケープされるコマンド
エスケープされた文字列
例1 escapeshellcmd() の例
<?php
// 意図的に、任意の数の引数を指定できるようにしています
$command = './configure '.$_POST['configure_options'];
$escaped_command = escapeshellcmd($command);
system($escaped_command);
?>
escapeshellcmd() はコマンド文字列全体に適用しなければなりません。 また、そうしたところで、まだ任意の数の引数を渡すことによる攻撃を許してしまいます。 単一の引数をエスケープするには、かわりに escapeshellarg() を使わねばなりません。
スペースは
escapeshellcmd()
関数ではエスケープされません。
たとえば、Windows で問題になりがちな
C:\Program Files\ProgramName\program.exe
のようなパスが当てはまります。
この問題は以下のようなコードで緩和できます:
<?php
$cmd = preg_replace('`(?<!^) `', '^ ', escapeshellcmd($cmd));