0
A
回答
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();
假设当前目录是在classpath中,并进一步假设点播类加载器加载类,这或类似的东西应该工作,至少例如你的System.out
。
使用此代码时,请注意,上传的代码可能会执行任何操作,包括调用System.exit(1)
,读取文件系统中的所有文件,在计算机上启动僵尸网络等。
而不是代码的最后两行,你也可以这样做:
Runtime.getRuntime().exec("java " + className);
(或它的一些变化,然后让你捕捉System.out
和System.err
,所以你可以喂它们回HTTP客户端,这也可以防止来自System.exit
的任何危险,因此只剩下许多其他漏洞。)
相关问题
- 1. 如何在运行时从JTextArea运行/编译Java代码?
- 2. 在运行时编译java代码
- 3. 如何在运行时编译代码
- 4. 使用JavaCompiler和ClassLoader编译和运行用户代码
- 5. 在运行时生成,编译和使用Java代码?
- 6. 编译和执行使用Java代码运行#EXEC()
- 7. Java代码不能编译或运行
- 8. 在运行时编译运行代码
- 9. 如何在Windows上编译和运行GVim中的C代码?
- 10. 如何在vim中快速编译和运行scala代码?
- 11. 如何通过javac/java编译/运行java代码?
- 12. 在.Net核心1.0中运行时编译和运行代码
- 13. 如何编译java代码?
- 14. 重新编译并在运行时重新运行Java代码
- 15. 如何在OS X中使用masm编译和运行汇编代码?
- 16. 运行时代码生成和编译
- 17. 如何让Java编译器在编译代码中生成行号码
- 18. 如何编译和运行Java程序?
- 19. 如何运行和编译java程序?
- 20. Java代码和JIT编译
- 21. 如何编译并运行里面JEDIT Java代码?
- 22. Java代码编译但整个代码不运行
- 23. 使用javax.tools在运行时编译java源代码?
- 24. 如何用gradle编译java 1.3代码?
- 25. 如何在线编译Java代码?
- 26. Java和NetBeans:无法从编译文件运行代码
- 27. 在编译时运行任意代码
- 28. 在运行时编译renderscript代码
- 29. 在iPhone上编译/运行C++代码
- 30. 如何编译和运行我的Maven单元测试Java 8,同时让我的代码编译为Java 7
对于初学者:对安全性变得极度偏执。 –
@LouisWasserman当然,但编译和运行用户代码是我的想法的基础。 – z17
是否需要编译程序中的代码?提供用户可以编程的接口,编译自己的实现,然后在程序中注册它们的实现(.jar文件)是一种更常见的技术。当您必须注册JDBC驱动程序时,这是启用JDBC的程序的工作方式。 – Samuel