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

How to compile and run code from user in Java?

我怎样才能运行一个Java代码,哪个用户在请求中发给我?

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

一个非常粗略的方法是这样的:

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 客户端。这也可以防止来自 System.exit,因此只剩下许多其他漏洞。)