tryruby.orgのようなものを作りたいです。ユーザー(たとえばecho __FILE__
)から1行を取得し、それをPHPで実行して、出力をクライアントに返したいと思います。
やろうとしましたがexec('php -r ' . $command, $output)
、$output
常にPHPヘルプセクションが含まれています。
この機能を実装するにはどうすればよいですか?
tryruby.orgのようなものを作りたいです。ユーザー(たとえばecho __FILE__
)から1行を取得し、それをPHPで実行して、出力をクライアントに返したいと思います。
やろうとしましたがexec('php -r ' . $command, $output)
、$output
常にPHPヘルプセクションが含まれています。
この機能を実装するにはどうすればよいですか?
php -r
実行したいコードを'
..コードの間に配置する必要があるようにするには..'
例:
php -r ' $var = 34; print_r($var); '
問題は、実行するコードをでラップしていないことのようです' '
。'
また、コード、特殊文字、エスケープシーケンスなどにも注意する必要があります。
実際、を使用することを主張する場合はexec()
、これを行う方がよい場合があります(エスケープなどの心配を完全に回避するため)。
$command = base64_encode($command);
exec("php -r 'eval(base64_decode(\"$command\"));'", $output);
上記の投稿の代わりに使用できます。eval()
ここでの主な問題(eval()
とあなたのexec()
コードの両方)は、ユーザー入力からPHPコードを取得することは単に安全ではないということです:
eval()言語構造は、任意のPHPコードを実行できるため、非常に危険です。したがって、その使用はお勧めしません。この構成を使用する以外に選択肢がないことを注意深く確認した場合は、事前に適切に検証せずに、ユーザーが提供したデータを渡さないように特に注意してください。
PHPコードの結果を返したいので、Ajaxを使用して、PHPコードをパラメーターとしてスクリプト(おそらくBase64でエンコードされたもの)に渡すというクールなことを行うことができます。
$code = base64_decode($_GET['code']);
// Clean the user input here
eval($code);
jQueryを使用したAjaxの例:
// assuming `code` contains the PHP code
var encoded = base64_enc(code);
$.get('execute.php?code=' + encoded, function(data) {
var result = new String(data);
// do something with the result here, such as displaying it
}, dataType='text');
JavaScriptでのBase64エンコーディングについては、こちらをご覧ください。
http://tryruby.orgにはインタラクティブなRubyシェルがあるようです。それは良い出発点のようです。
PHPにそのようなシェルを提供する2つのプロジェクトがあります:php_replとphpsh。
他の部分は、インタラクティブシェルのWebインターフェイスです。その部分については、多くの言語にこのサービスを提供するrepl.itをご覧になることをお勧めします(残念ながらPHPではありません)。ソースコードへのリンクは次のとおりです。
この組み合わせで、クールプロジェクトを完了することができるはずです。
'eval()'を調べてください。さらに重要なのは、eval()とあなたがやろうとしていることを安全な方法で達成するのが非常に難しい理由です。たとえば、以下を入力するユーザーのイメージング:
echo file_get_contents('/etc/passwd');
これを安全にするには、評価されたプロセスから行われるすべてのシステムコールを監視およびフィルタリングするなど、かなりの作業が必要になります。
乾杯