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.
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.
ç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.)
Yeni başlayanlar için: güvenlik konusunda son derece paranoyaklaşın. –
@LouisWasserman elbette, ancak derlemek ve kullanıcı kodu çalıştırmak benim fikrim temelidir. – z17
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