2010-01-27 11 views
7

abbiamo un'applicazione Java e desidera eseguire codice non attendibile utilizzando la funzione integrata in Javascript interprete (javax.script. *)Come bloccare (o sandbox) built-in JavaScript interprete per eseguire gli script non attendibili del JDK

Tuttavia, per impostazione predefinita, l'interprete consente l'accesso a qualsiasi classe java. Ad esempio "java.lang.System.exit(0)" nello script interromperà la JVM. Credo che questo si chiami "Live Connect", vedi Sun "Java Scripting Programmer's Guide" per maggiori dettagli.

vorrei trasformare in qualche modo fuori la possibilità per lo script per accedere alle classi Java, vale a dire voglio solo lo script per essere in grado di accedere agli oggetti che ho specificamente iniettare nel usando i eval() o put() metodi su ScriptEngine.

ho trovato un po 'di documentazione su come raggiungere questo obiettivo con più vecchia versione autonoma dell'interprete (Rhino), ad esempio, vedere http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

Tuttavia questo approccio non è possibile in JDK 1.6 senza utilizzare classi interne del sole, come il ClassShutter ecc. È tutto configurato internamente e non può essere sovrascritto con metodi pubblici.

Spero che ci sia un modo semplice per aggirare questo che non richiede il salto attraverso cerchi complessi utilizzando un SecurityManager personalizzato, ClassLoader, ecc. Ma non è stato possibile trovare nulla.

Ci si aspetterebbe che con la frequenza dei bollettini sulla sicurezza che circondano Javascript in diverse applicazioni, ci sarebbe un semplice flag per disabilitare Live Connect!

+0

Vedi anche: http://stackoverflow.com/questions/1347099/how-do-i-secure-scripts -run-using-javax-scripting – McDowell

+0

Ancora non riesco a credere nel 2014 non esiste un modo semplice per disattivare Live Connect per Java ScriptEngine. Ho cercato e cercato senza fortuna per trovare un modo semplice per limitare l'accesso.Sto distribuendo un'applicazione lato server che dovrebbe essere in grado di analizzare il JavaScript fornito dal client usando JSR 223 e senza poter disabilitare cose come "' java.awt.Desktop.getDesktop() '" o "' java.lang.System.exit (0) '" è quasi impossibile da implementare. – chrixm

risposta

1

Ho cercato molto, ho provato il modo di sandboxing del blog di codeutopia.net e altre soluzioni di SecurityManager, mi sono sentito insoddisfatto. E poi è uscita la mia soluzione per il caricatore di classi, basata sulla libreria di rhino incorporata JDK senza importare alcuna libreria di terze parti. Due classi java con circa 200 linee di codici, è attualmente la mia soluzione più semplice che si adatta al mio requisito solo JavaScript.

  1. Trova il motore di script JavaScript nome della classe di fabbrica ScriptEngineManager # getEngineFactories
  2. script di carico classe fabbrica di motori di una nuova classe loader, in cui verranno ignorati JavaMembers o altre classi correlate.
  3. Chiama #getScriptEngine su factory motore di script caricato e script eval sul motore di script restituito.

Se lo script fornito contiene uno script Java, il programma di caricamento classe tenterà di caricare JavaMembers o altre classi e di attivare le eccezioni di classe non trovata. In questo modo, gli script dannosi verranno ignorati senza esecuzione.

Si prega di leggere i file ConfigJSParser.java e ConfigJSClassLoader.java per maggiori dettagli:

https://github.com/webuzz/simpleconfig/tree/master/js/im/webuzz/config

Problemi correlati