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