ユーザー入力をコマンドに安全に渡す

ユーザー入力をコマンドに安全に渡す

daemonサーバーAで実行されているデーモンがあります。

daemon_adm.pyデーモンプロセス(サーバーA)を制御するためのパラメータベースのスクリプトがあります。このスクリプトを使用すると、ユーザー入力から「メッセージ」を挿入できますdaemon。あなたが好きなものを無料でテキストを送信します。

daemon_adm.pyその後、サーバーBにはphpseclibのSSH2クラスを使用してPHPで使用されるWebインターフェースがあります。

ユーザー入力をコマンドラインに渡すことはお勧めできませんが、WebサーバーBからdaemon_adm.pyサーバーAにテキストを渡す方法が必要です。

コマンドラインユーティリティにテキストを引数として安全に渡す方法は?

daemon_adm.pyこのパラメータをエコーし​​て次のようにパイプしても:

<?php 
$command = '/path/to/daemon_adm.py "'.$text.'"';
ssh->exec($command);
// or whatever other library or programming language
?>

コマンドはフォーマットされた文字列でSSHインタフェースを介して実行されるため、コードを挿入できます。

<?php 
$text = 'safetext"; echo "hazard"';
$command = '/path/to/daemon_adm.py "'.$text.'"';
ssh->exec($command);
// command sent: /path/to/daemon_adm.py "safetext"; echo "hazard"
?>

現在のオプションは、各ユーザー入力をbase64(私が知っている限り、文字セットに引用符とスペースを使用しない)でエンコードし、daemon_adm.py次のように内部的にデコードすることです。

<?php 
$text = 'safetext"; echo "hazard"';

// Enconding it to base64

$command = '/path/to/daemon_adm.py '.$encoded_text;
ssh->exec($command);

// command sent: /path/to/daemon_adm.py c2FmZXRleHQiOyBlY2hvICJoYXphcmQi
?>

これは十分に安全ですか、それとも複雑ですか?

- 編集する -

Barmarが指摘した間接的な解決策は、daemon_adm.pyシェルから解析可能な引数ではなくstdinからのテキストデータを受け入れることです。

答え1

ssh2::exec()リモートコマンドのstdinstdoutおよびに接続されたストリームを返します。stderrだからあなたはこれを行うことができます:

$command = '/path/to/daemon_adm.py';
$stream = $ssh->exec($command);
fwrite($stream, "$text\n");

stdinを介してパラメータを渡したくない場合は、次のものを使用できます。escapeshellarg():

$command = '/path/to/daemon_adm.py ' . escapeshellarg($text);
$ssh->exec($command);

答え2

シェルフラグメントに文字列を挿入し、シェルが文字列を文字通り解釈するようにソートする比較的簡単な2つの方法があります。

  • 文字列を一重引用符で囲み、各一重引用符を'4文字の文字列に置き換えます'\''
  • 各ASCIIステートメント文字の前にプレフィックスを付けて\(他の文字も前に付けることができます)、改行(一重引用符または二重引用符の間の改行)をまたはに置き換え'␤'ます。"␤"

SSHを介してリモートコマンドを呼び出すときにリモートシェルがコマンドを拡張することに注意してください。

PHPが提供するescapeshellargシェル特殊文字をエスケープする機能です。セセexec拡張を実行するには、保護する文字列を2回呼び出します。

これはテキスト文字列では機能しますが、バイト文字列では機能しません。ほとんどのシェルはヌルバイトを通過しません。

エラーが少なくなり、ランダムなバイト文字列を渡すことを可能にするもう1つのアプローチは、もう一方の端で実行されている項目を変更する必要があることです。リモートコマンドの標準入力に文字列を渡す

答え3

あなたは次のことをすることができます...

$ssh->enablePTY();
$ssh->exec('/path/to/daemon_adm.py');
$ssh->write('...');
echo $ssh->read();

関連情報