16

私は、会社が使用している恐ろしいソフトウェアにWebインターフェイスをコーディングしています。このソフトウェアには実際のUIがなく、クライアントがデータをプルするために、システムへのパテアクセスを提供する必要があります。私のWebインターフェースはexec();関数を実行する必要があり、ユーザーが入力するいくつかの変数を渡す必要があります。

$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'";
$last_line = exec($command, $output, $returnvalue); 

今では、変数からセミコロンを削除して$command安全である可能性があると思いますが、確信が持てないため、来月公開する前にここでポーズをとっています。

消毒するための最良の方法は何でしょう$commandか?変数に含める必要のある特別な文字がいくつかあります [ ] < > ! # $

4

1 に答える 1

22

この目的のためにPHPが持っている関数を使用してください:

$cmd = 
     "/usr/bin/do-something " . 
     escapeshellarg($arg1) . 
     ' ' . 
     escapeshellarg($arg2);

使用することもできますescapeshellcmd()

違いは何ですか?

escapeshellarg()文字列の前後に'を追加し、他の'文字の前に\を追加するだけです。 http://www.php.net/escapeshellarg

escapeshellcmd()シェルに依存するすべての文字($、\など)をエスケープしますが、引用符は追加しません。 http://www.php.net/manual/en/function.escapeshellcmd.php

escapeshellarg()落とし穴は、QUOTEDパラメーターの一部として使用する場合です。次に、それは役に立たなくなります(実際にはミックスに引用符を追加します)。

一般的に、escapeshellcmd()私たちは独自の引用符を追加して使用することを好みます。

$cmd = 
    "/usr/bin/do-something '" . 
    escapeshellcmd($arg1) . 
    "' '" . 
    escapeshellcmd($arg2) . 
    "'";

安全に!

于 2009-06-11T18:57:46.343 に答える