Es tut mir leid, wenn dies ein unklarer Titel ist, weil ich nicht die ganze Terminologie kenne, also bitte mit mir ertragen.Sicher laufenden JavaScript-Code in Java
Also ich versuche, eine kontrollierte Umgebung zu erstellen, um JavaScript-Code in einer Java-Anwendung auszuführen. Hinweis: Code wird von einem Benutzer erstellt, so dass ich Code blockieren/verhindern muss, der speziell versucht, auf Java-Variablen zuzugreifen/diese zu modifizieren, die nicht in Reichweite sein sollen. (vorzugsweise durch einen Kompilierungsfehler für Benutzerfeedback)
Edit 1: Übrigens habe ich versucht, Rhino und Nashorn zu verwenden.
Hier ist ein einfaches Beispiel.
public class ScriptRunner{
public Foo foo=new Foo();
//this is not supposed to be accessed by the script
public int money=0;
public Object run(){
return compiler.compile(STRING START (obtained from a file)
function main(someObject){
//this is not allowed
someObject.money=10000000000000000000000;
//or this
var someBlacklistedJavaObject=.....
someBlacklistedJavaObject.someFuncton();
//but this is allowed
someObject.foo.name="Bob";
return someObject.foo.someFunction();
}
STRING END).run("main",this);
}
}
Auch ich bin nicht sicher, ob dies eine der möglichen Lösung wäre, aber ich kann nicht die eingebaute Java-Sicherheitsklasse aufgrund eines nicht erreichbaren Code es und nicht die Implementierung verwenden ermöglicht das Sicherheitsobjekt auf etwas zu setzen sonst.
Was mir in den Sinn kommt ist, dass eine einfache Implementierung von Wrapper Java-Klassen in einem Paket zu erstellen wäre. Überprüfen Sie dann, ob ein Java-Objekt im Skript diesen Pfad nicht enthält und einen Fehler auslöst. Aber das Problem ist, dass ich keine Ahnung habe, wie ich das machen soll.
Hier ist eine einfache Visualisierung dessen, was ich versuche zu tun.
Edit 2: Es ist wünschenswert, ein niedriges Java-Kompatibilitätsprofil beizubehalten, aber es ist nicht 100% notwendig.
haben schauen Sie auf [Nashorn] (http://www.oracle.com/technetwork/articles/java/jf14-nashorn -2126515.html)? – ebanouz
Ja, tat ich. Alles, was ich ausprobiert habe, gibt mir einen Fehler, dass die Klasse aus Nashorn nicht existiert oder keinen Zugriff darauf hat. – LapisSea