我想制作像tryruby.org这样的东西。
我从用户那里拿了一行(例如echo __FILE__
),我想用PHP执行它并将输出返回给客户端。
我尝试exec('php -r ' . $command, $output)
,但$output
总是包含php帮助部分。
任何人都可以帮助我或提供如何实施此功能的建议。
很多。
答案 0 :(得分:11)
要制作php -r
,您必须在'
代码之间放置要执行的代码.. '
示例:
php -r ' $var = 34; print_r($var); '
答案 1 :(得分: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);
使用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中的base 64编码,see this。
答案 2 :(得分:0)
查找'eval()',更重要的是,为什么eval()和你想要做的事情很难以安全的方式实现。成像例如输入的用户:
echo file_get_contents('/etc/passwd');
您需要做很多工作才能确保安全,包括观察和过滤从评估过程中进行的所有系统调用。
干杯
答案 3 :(得分:0)
http://tryruby.org似乎有一个交互式的Ruby shell。这似乎是一个很好的起点。
以下是为PHP提供此类shell的两个项目:php_repl和phpsh。
另一部分是交互式shell的Web界面。对于那部分,我建议您查看repl.it,它为许多语言提供此服务(但遗憾的是不是PHP)。 Here's a link它的源代码。
通过这种组合,您应该能够完成cour项目。