2016-07-19 24 views
3

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.

+0

haben schauen Sie auf [Nashorn] (http://www.oracle.com/technetwork/articles/java/jf14-nashorn -2126515.html)? – ebanouz

+0

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

Antwort

2

Verwenden Sie ein ClassFilter mit Nashorn (Anmerkung: erfordert Java> = 1.8.0_40)

+0

Danke! Ich wusste das nicht, aber eine der wünschenswerten Eigenschaften meines Codes ist, dass es mit der Java-Version kompatibel ist. Daher wäre ich sehr dankbar, wenn jemand auf eine andere Lösung hinweist. :) Aber wenn es keinen anderen Weg gibt als ich denke, das funktioniert. – LapisSea

+1

OK, gut ... Nashorn wurde nur mit Java 8 veröffentlicht. Wenn Sie also niedrigere Java-Hauptversionen unterstützen müssen, müssen Sie sich 'ClassShutter' für Rhino ansehen - aber ein schneller Google zeigt schnell, dass das nicht der robusteste/sichere Option. – searlea

+0

Danke. Ich mache einige Nachforschungen darüber. – LapisSea