2012-04-05 85 views
3

我想做類似tryruby.org的東西。 我從用戶(例如echo __FILE__)取出一行,然後我想在PHP中執行它並將輸出返回給客戶端。嵌入式PHP(命令行)

我試圖做exec('php -r ' . $command, $output),但$output總是包含php的幫助部分。

任何人都可以幫助我或給出一個建議如何實現此功能。

Thx很多。

+0

試試'exec(「php -r \」$ command \「」,$ output)'。 BUt在任何情況下,它太危險,使用戶可以在你的機器上運行命令 – safarov 2012-04-05 08:45:11

+0

看看'eval' http://php.net/manual/en/function.eval.php,但我不會建議只是把任何東西用戶在那裏。你會希望事先嚴格篩選出來。 – Nick 2012-04-05 08:46:09

+2

更好的是,看看['Runkit_Sandbox'](http://de2.php.net/manual/en/runkit.sandbox.php)。 – vstm 2012-04-05 08:48:06

回答

5

它看起來像你的問題是,你沒有包裝你的代碼與' '執行。您還需要注意代碼中的',特殊字符,轉義序列等。

事實上,如果您堅持使用exec(),那麼最好不要這樣做(爲了完全避免擔心轉義而這樣的):

$command = base64_encode($command); 
exec("php -r 'eval(base64_decode(\"$command\"));'", $output); 

可能使用eval(),而不是你在上面張貼什麼。

這裏(均與eval()和你exec()代碼)的主要問題是,服用PHP代碼從用戶輸入根本就沒有安全的

中的eval()語言結構是很危險,因爲它允許執行任意PHP代碼。因此不鼓勵使用它。如果您已經認真核實沒有其他選擇而不是使用此構造,請特別注意不要將任何用戶提供的數據放入其中,而不事先對其進行正確驗證。


建議

由於要返回的PHP代碼的結果,你可能會做一些很酷的東西與AJAX你通過PHP代碼的腳本(base 64編碼,或許)作爲參數:

$code = base64_decode($_GET['code']); 
// clean the user input here 
eval($code); 

AJAX實施例使用jQuery:

// 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中的base 64編碼,see this

0

查看'eval()',更重要的是,爲什麼eval()和你想要做的事很難以安全的方式實現。成像,例如,用戶輸入誰:

echo file_get_contents('/etc/passwd'); 

你需要相當多的工作,使這個安全,包括鯨和過濾所有的系統調用從eval'd工藝製成。

乾杯

7

爲了php -r你必須得把你想要' ..你的代碼之間執行代碼.. '

例子:

php -r ' $var = 34; print_r($var); ' 
0

http://tryruby.org似乎有交互式Ruby shell。這似乎是一個很好的起點。

這裏有兩個項目爲PHP提供了這樣一個shell:php_replphpsh

另一部分是交互式shell的web界面。對於這一部分,我建議你看看repl.it,它提供了許多語言的服務(但可惜不是PHP)。 Here's a link它的源代碼。

有了這個組合,你應該可以完成cour項目。