Jestem całkiem nowy dla groovy i skryptów w java ogólnie, i naprawdę mam nadzieję, że istnieje proste rozwiązanie mojego problemu. W naszej aplikacji użytkownicy mogą uruchamiać groovy skrypty, które piszą samodzielnie, i musimy kontrolować, co te skrypty mogą i nie mogą zrobić. Dużo czytam na temat piaskownicy, ale albo patrzę na niewłaściwych miejsc, albo przeoczyłem oczywistość. Aby było prostsze, mam mały przykład demonstrujący problem. To moja klasa ładowarka, która powinna zapobiec java.lang.System
od bycia załadowany i dostępne dla skryptów:Jak zablokować dostęp do niektórych klas podczas wykonywania groovy skryptów z java?
public class MyClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
if (name.startsWith("java.lang.System")) {
throw new ClassNotFoundException("Class not found: " + name);
}
return super.loadClass(name);
}
}
A to prosty program, który próbuje wywołać System.currentTimeMillis()
:
public static void main(String[] args) {
String code = "java.lang.System.currentTimeMillis();";
ClassLoader classLoader = new MyClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
GroovyShell shell = new GroovyShell();
Script script = shell.parse(code);
Object result = script.run();
log.debug(result);
}
MyClassLoader
generuje wyjątki dla java.lang.SystemBeanInfo
i java.lang.SystemCustomizer
, ale kod zostanie wykonany. samo dzieje się, jeśli mogę użyć javax.script
klasy:
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("Groovy");
Object o = engine.eval(code);
log.debug(o);
A jeśli próbuję go z silnikiem JavaScriptu, to działa zgodnie z oczekiwaniami (wystarczy wymienić „Groovy” z „Javascript” w powyższym przykładzie).
Czy ktoś może mi w tym pomóc? BTW, używam groovy-all-1.8.8.jar, z jdk1.7.0_55.
Dzięki
Działa to samo z groovy v.2.3.6 i java 1.8.0_05. 'java.lang.System' nie jest nawet załadowany tym programem ładującym klasy. – Opal
@Opal Ten moduł ładujący próbuje załadować 'java.lang.SystemBeanInfo' i' java.lang.SystemCustomizer', który, jak zakładam, wykorzystuje do zawijania 'java.lang.System'. Ale ma sens, że inny program ładujący klasy jest w użyciu, niezależnie od 'MyClassLoader' nie ma nadrzędnego programu ładującego klasy, po prostu nie wiem jak to działa i jak dostosować to zachowanie. –