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()
リモートコマンドのstdin
、stdout
およびに接続されたストリームを返します。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);