我想做類似tryruby.org的東西。 我從用戶(例如echo __FILE__
)取出一行,然後我想在PHP中執行它並將輸出返回給客戶端。嵌入式PHP(命令行)
我試圖做exec('php -r ' . $command, $output)
,但$output
總是包含php的幫助部分。
任何人都可以幫助我或給出一個建議如何實現此功能。
Thx很多。
我想做類似tryruby.org的東西。 我從用戶(例如echo __FILE__
)取出一行,然後我想在PHP中執行它並將輸出返回給客戶端。嵌入式PHP(命令行)
我試圖做exec('php -r ' . $command, $output)
,但$output
總是包含php的幫助部分。
任何人都可以幫助我或給出一個建議如何實現此功能。
Thx很多。
它看起來像你的問題是,你沒有包裝你的代碼與' '
執行。您還需要注意代碼中的'
,特殊字符,轉義序列等。
事實上,如果您堅持使用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。
查看'eval()',更重要的是,爲什麼eval()和你想要做的事很難以安全的方式實現。成像,例如,用戶輸入誰:
echo file_get_contents('/etc/passwd');
你需要相當多的工作,使這個安全,包括鯨和過濾所有的系統調用從eval'd工藝製成。
乾杯
爲了php -r
你必須得把你想要'
..你的代碼之間執行代碼.. '
例子:
php -r ' $var = 34; print_r($var); '
http://tryruby.org似乎有交互式Ruby shell。這似乎是一個很好的起點。
這裏有兩個項目爲PHP提供了這樣一個shell:php_repl和phpsh。
另一部分是交互式shell的web界面。對於這一部分,我建議你看看repl.it,它提供了許多語言的服務(但可惜不是PHP)。 Here's a link它的源代碼。
有了這個組合,你應該可以完成cour項目。
試試'exec(「php -r \」$ command \「」,$ output)'。 BUt在任何情況下,它太危險,使用戶可以在你的機器上運行命令 – safarov 2012-04-05 08:45:11
看看'eval' http://php.net/manual/en/function.eval.php,但我不會建議只是把任何東西用戶在那裏。你會希望事先嚴格篩選出來。 – Nick 2012-04-05 08:46:09
更好的是,看看['Runkit_Sandbox'](http://de2.php.net/manual/en/runkit.sandbox.php)。 – vstm 2012-04-05 08:48:06