Frage

Ein Teil unserer Java-Anwendung benötigt Javascript auszuführen, die von Nicht-Entwickler geschrieben. Diese Nicht-Entwickler sind mit Hilfe von JavaScript für die Datenformatierung. (Einfache Logik und String-Verkettung meist).

Meine Frage ist, wie kann ich Setup die Ausführung dieser Skripte sicher Skriptfehler erhebliche negative Auswirkungen auf den Rest der Anwendung haben nicht zu machen.

  • Sie benötigen gegen Endlosschleifen schützen
  • Schutz gegen neue Themen Laichen.
  • Beschränken Sie den Zugriff auf Dienste und Umgebung
    • Dateisystem (Beispiel: Wenn ein verärgerter Texter entschieden Dateien zu löschen)
    • Datenbank (Das Gleiche gilt löschen Datenbank Datensätze)

Im Grunde muss ich Setup die JavaScript-Umfang enthalten nur genau das, was sie brauchen, und nicht mehr.

War es hilfreich?

Lösung

Zum Schutz vor Endlosschleifen, werden Sie es in einem separaten Prozess setzen müssen, so dass sie getötet werden könnten.

Zum Schutz gegen Fäden zu schaffen, müssen Sie Securitymanager (die Standardimplementierung ermöglicht nicht vertrauenswürdigen Code für den Zugriff auf Nicht-Root-Thread-Gruppen).

erweitern

Java-Sicherheit ermöglicht es Ihnen, den Zugriff auf das Dateisystem zu verhindern.

Für Datenbank Einschränkungen, können Sie möglicherweise die Standard-SQL-Benutzersicherheit verwenden, aber das ist ziemlich schwach. Andernfalls müssen Sie eine API zur Verfügung zu stellen, die Ihre Einschränkungen erzwingen.

Edit:. Ich möchte darauf hinweisen, dass die Version von Rhino mit JDK6 genannten Sicherheit stellt die Arbeit daran getan hatte, nicht jedoch den Compiler

Andere Tipps

Zum Schutz vor Endlosschleifen, können Sie die Anweisung Zahl beobachten, wie das Skript ausgeführt wird (dies funktioniert nur mit interpretiert Skripte, nicht mit kompiliert ist).

Es gibt diese Beispiel in der Rhino JavaDocs ein Skript zu verhindern, für mehr als 10 Sekunden ab:

 protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }

Java-Klasse und Methode Zugang zu sperren haben einen Blick auf ...

http://codeutopia.net/blog/2009 / 01/02 / Sandbox-Nasen-Ohren-in-java /

Ich lief über diese Blog-Post, die für die Sandbox mehr oder weniger alles (nicht nur Rhino), nützlich zu sein scheint:

http://calumleslie.blogspot.com/2008/06/ simple-jvm-sandboxing.html

Wenn Sie auf der Suche nach reinen JavaScript-Funktionen nur, hier ist eine Lösung Stationierung auf JDK eingebettet Rhino Bibliothek ohne 3rd-Parteien-Bibliotheken zu importieren:

  1. Finden Sie heraus, JavaScript Script-Engine Factory-Klasse Namen von Script # getEngineFactories
  2. Laden Skript-Engine Factory-Klasse in einem neuen Class Loader, in denen JavaMembers oder anderen verwandten Klassen werden ignoriert.
  3. Rufen Sie #getScriptEngine auf geladene Script-Engine Fabrik und eval-Skripte auf zurück Script-Engine.

Wenn angegeben Skript Java Skript enthält, Class-Loader werden versuchen JavaMembers oder andere Klassen und Trigger-Klasse laden keine Ausnahmen gefunden. Auf diese Weise werden schädliche Skripts ohne Ausführung ignoriert werden.

Bitte lesen Sie ConfigJSParser.java und ConfigJSClassLoader.java Dateien für weitere Informationen:

https://github.com/webuzz/simpleconfig/ Baum / Master / src / im / webuzz / config

Javascript ist single-threaded und kann das Dateisystem nicht zugreifen, so dass ich glaube nicht, dass Sie über diejenigen kümmern. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, ein Timeout zu setzen gegen Endlosschleifen zu schützen, aber man kann immer einen (Java) Thread erzeugen, die das Skript ausgeführt wird, und dann nach so viel Zeit, um den Faden töten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top