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

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

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);

おすすめ記事