10

tryruby.orgのようなものを作りたいです。ユーザー(たとえばecho __FILE__)から1行を取得し、それをPHPで実行して、出力をクライアントに返したいと思います。

やろうとしましたがexec('php -r ' . $command, $output)$output常にPHPヘルプセクションが含まれています。

この機能を実装するにはどうすればよいですか?

4

4 に答える 4

20

php -r実行したいコードを'..コードの間に配置する必要があるようにするには..'

例:

php -r ' $var = 34; print_r($var); '
于 2012-04-05T08:47:28.777 に答える
6

問題は、実行するコードをでラップしていないことのようです' ''また、コード、特殊文字、エスケープシーケンスなどにも注意する必要があります。

実際、を使用することを主張する場合は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エンコーディングについては、こちらをご覧ください

于 2012-04-05T09:17:32.287 に答える
1

http://tryruby.orgにはインタラクティブなRubyシェルがあるようです。それは良い出発点のようです。

PHPにそのようなシェルを提供する2つのプロジェクトがあります:php_replphpsh

他の部分は、インタラクティブシェルのWebインターフェイスです。その部分については、多くの言語にこのサービスを提供するrepl.itをご覧になることをお勧めします(残念ながらPHPではありません)。ソースコードへのリンクは次のとおりです。

この組み合わせで、クールプロジェクトを完了することができるはずです。

于 2012-04-05T08:52:59.630 に答える
-1

'eval()'を調べてください。さらに重要なのは、eval()とあなたがやろうとしていることを安全な方法で達成するのが非常に難しい理由です。たとえば、以下を入力するユーザーのイメージング:

echo file_get_contents('/etc/passwd');

これを安全にするには、評価されたプロセスから行われるすべてのシステムコールを監視およびフィルタリングするなど、かなりの作業が必要になります。

乾杯

于 2012-04-05T08:45:20.890 に答える