2016-04-14 17 views
0

Bir kullanıcı, istekte bana gönderen bir Java kodunu nasıl çalıştırabilirim?Java'da kullanıcı kodu nasıl derlenir ve çalıştırılır?

Kullanıcılardan, bazı sınıflarım kullanan ve çalıştıran bir kod almam gerekiyor.

+5

Yeni başlayanlar için: güvenlik konusunda son derece paranoyaklaşın. –

+0

@LouisWasserman elbette, ancak derlemek ve kullanıcı kodu çalıştırmak benim fikrim temelidir. – z17

+0

Programdaki kodu derlemeniz şart mı? Kullanıcıların programlayabilmeleri, kendi uygulamalarını derleyebilmeleri ve uygulamalarını (.jar dosyası) programınıza kaydettirebilmeleri için daha yaygın bir tekniktir. JDBC sürücüsünü kaydetmeniz gerektiğinde, JDBC etkin programların çalışması bu şekilde gerçekleşir. – Samuel

cevap

0

çok ham yolu bu olacaktır:

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(); 

en azından geçerli dizin sınıf yolunda olduğunu varsayarsak, ve daha fazla classloader yükler sınıfları on-demand, bu veya benzer bir şey çalışması gerekir varsayarak System.out örnek için. Bu kodla çalışırken, yüklenen kodun System.exit(1)'u çağırmak, dosya sistemindeki tüm dosyaları okumak, bilgisayarda bir botnet başlatmak, vb. Dahil olmak üzere her şeyi yapabileceğini unutmayın. Bunun yerine kodunun son iki hatlarının

, ayrıca yapabilirdi:

Runtime.getRuntime().exec("java " + className); 

(Ya sonra System.out ve System.err yakalamaya yarayan bir kısmı varyasyonu, bu yüzden onları geri besleyebilir HTTP istemcisi: Bu, System.exit'dan kaynaklanan herhangi bir tehlikeyi de önler, böylece yalnızca diğer birçok güvenlik açığından kurtulmuş olur.)

+0

Bunu zaten yaptım, ikinci yoldan yazdığın gibi. Teşekkür ederim. – z17

+0

Güvenlik hakkında: Bu kodu, hiç kimsenin yatağa takılmadığı bir kapta çalıştırmak mümkündür. Ayrıca Java Derlemesi API'sini okudum, ancak henüz denemedim. – z17

İlgili konular