G
Gelöschtes Mitglied 48575
Gast
Hallo liebes Java-Forum,
ich schreibe momentan ein kleines Programm in welchem man über eine Web-Oberfläche Code schreiben kann, welcher dann kompiliert und ausgeführt wird.
Nun will ich, dass dieser Code nur begrenzte Rechte verfügt. Ich habe da die Möglichkeit gefunden dies über den SecurityManager zu realisieren, jedoch weiß ich nicht wie ich die Rechte des eingegebenen Codes einschränken kann während mein Code weiterhin über alle Rechte verfügt.
Ich habe schon das 'codeBase'-Attribut der Policy-Datei ins Auge gefasst um damit meinen Code alle Rechte zu geben und ansonsten keine Rechte zu verteilen:
Doch obwohl der PATH auf das oberste Verzeichnis meines Programms verweist (bin/src sind Unterordner) und er durch die "/-" alle Unterverzeichnisse miteinbeziehen müsste, hat mein Code immer noch nicht alle Rechte.
Beim Anstoßen der Kompilierung (javax.tools.JavaCompiler.CompilationTask.call()) bekomme ich bei dieser Variante folgende Fehlermeldung:
Obwohl alle Rechte für die entsprechenden Dateien gewährt wurde (bestätigt dadurch das bei einigen vorangegangen Rechte zB zum Erstellen eines ClassLoaders eingefordert wurden).
Um nicht für jeden eingegebenen Code eine .java- und eine .class-Datei anlegen zu müssen, habe ich einen eigenen ClassLoader verwendet der die URI
mitgegeben kriegt.
Die Verwendung des "signedBy" Attributes kommt für mich nicht wirklich in Frage, da ja nur .jar Dateien signiert werden können und das in einer Testumgebung wie Eclipse zu kompiliziert ist.
Nun komme ich zu meinen Fragen:
1. Hat jemand eine Idee wieso obwohl alle Rechte gewährt wurden, eine AccessControlException ausgeworfen wird?
2. Hat jemand vielleicht eine andere Idee den SecurityManager dementsprechend zu modifizieren?
3. Ist es überhaupt möglich den eingefügten Code von meinem zu unterscheiden? Ich rufe bestimmte Methoden ja nachher mit java.lang.reflect.Method.invoke() auf.
Danke schonmal für das Durchlesen
Gruß
Mofasofa
ich schreibe momentan ein kleines Programm in welchem man über eine Web-Oberfläche Code schreiben kann, welcher dann kompiliert und ausgeführt wird.
Nun will ich, dass dieser Code nur begrenzte Rechte verfügt. Ich habe da die Möglichkeit gefunden dies über den SecurityManager zu realisieren, jedoch weiß ich nicht wie ich die Rechte des eingegebenen Codes einschränken kann während mein Code weiterhin über alle Rechte verfügt.
Ich habe schon das 'codeBase'-Attribut der Policy-Datei ins Auge gefasst um damit meinen Code alle Rechte zu geben und ansonsten keine Rechte zu verteilen:
Java:
grant codeBase "file:/PATH/-" {
permission java.security.AllPermission;
};
grant {
};
Doch obwohl der PATH auf das oberste Verzeichnis meines Programms verweist (bin/src sind Unterordner) und er durch die "/-" alle Unterverzeichnisse miteinbeziehen müsste, hat mein Code immer noch nicht alle Rechte.
Beim Anstoßen der Kompilierung (javax.tools.JavaCompiler.CompilationTask.call()) bekomme ich bei dieser Variante folgende Fehlermeldung:
Java:
An exception has occurred in the compiler (1.8.0_05). Please file a bug at the Java Developer Connection ([url=http://java.sun.com/webapps/bugreport]Report a Bug or Request a Feature[/url]) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "nonBatchMode" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294)
at java.lang.System.getProperty(System.java:714)
at com.sun.tools.javac.main.Main.compile(Main.java:445)
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
.
.
.
Obwohl alle Rechte für die entsprechenden Dateien gewährt wurde (bestätigt dadurch das bei einigen vorangegangen Rechte zB zum Erstellen eines ClassLoaders eingefordert wurden).
Um nicht für jeden eingegebenen Code eine .java- und eine .class-Datei anlegen zu müssen, habe ich einen eigenen ClassLoader verwendet der die URI
Java:
URI.create( "string:///" + className + Kind.CLASS.extension )
Die Verwendung des "signedBy" Attributes kommt für mich nicht wirklich in Frage, da ja nur .jar Dateien signiert werden können und das in einer Testumgebung wie Eclipse zu kompiliziert ist.
Nun komme ich zu meinen Fragen:
1. Hat jemand eine Idee wieso obwohl alle Rechte gewährt wurden, eine AccessControlException ausgeworfen wird?
2. Hat jemand vielleicht eine andere Idee den SecurityManager dementsprechend zu modifizieren?
3. Ist es überhaupt möglich den eingefügten Code von meinem zu unterscheiden? Ich rufe bestimmte Methoden ja nachher mit java.lang.reflect.Method.invoke() auf.
Danke schonmal für das Durchlesen
Gruß
Mofasofa