如何运行Java代码,用户在请求中发送给我?
我需要从用户处获取代码,该代码使用我的一些类,运行它并获取结果。
答案 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.out
和System.err
,以便您可以将它们反馈给HTTP客户端。这也可以防止来自{{1}的任何危险},以便只留下许多其他漏洞。)