如何在Java中编译和运行用户代码?

时间:2016-04-14 20:36:22

标签: java javac

如何运行Java代码,用户在请求中发送给我?

我需要从用户处获取代码,该代码使用我的一些类,运行它并获取结果。

1 个答案:

答案 0 :(得分:0)

非常粗暴的方式是:

String code = request.getParameter("code");
String className = "Code" + DigestUtils.sha1hex(code);
String classCode = ""
  + "public class " + className + " implements Runnable {\n" +
  + "  public void run() {\n" +
  + code + "\n"
  + "  }\n"
  + "}\n";
Files.write(new File(className + ".java"), code, StandardCharsets.UTF_8);

Runtime.getRuntime().exec("javac " + className + ".java");

Class<?> clazz = Class.forName(className);
((Runnable)clazz.newInstance()).run();

假设当前目录在类路径中,并且进一步假设类加载器按需加载类,这个或类似的东西应该起作用,至少对于你的System.out示例。

使用此代码时,请注意上传的代码可能会执行任何操作,包括调用System.exit(1),读取文件系统中的所有文件,在计算机上启动僵尸网络等等。

代替最后两行代码,你也可以这样做:

Runtime.getRuntime().exec("java " + className);

(或者它的某些变体,然后允许您捕获System.outSystem.err,以便您可以将它们反馈给HTTP客户端。这也可以防止来自{{1}的任何危险},以便只留下许多其他漏洞。)

相关问题