如何在 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.out
和 System.err
,这样您就可以将它们反馈给 HTTP 客户端。这也可以防止来自 System.exit
,因此只剩下许多其他漏洞。)
我怎样才能运行一个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.out
和 System.err
,这样您就可以将它们反馈给 HTTP 客户端。这也可以防止来自 System.exit
,因此只剩下许多其他漏洞。)