Pregunta

Parte de nuestra aplicación Java necesita ejecutar JavaScript escrito por no desarrolladores.Estos no desarrolladores utilizan javascript para formatear los datos.(Lógica simple y concatenación de cadenas principalmente).

Mi pregunta es cómo puedo configurar la ejecución de estos scripts para asegurarme de que los errores de script no tengan un impacto negativo importante en el resto de la aplicación.

  • Necesidad de protegerse contra bucles infinitos
  • Protéjase contra la aparición de nuevos hilos.
  • Limitar el acceso a los servicios y al medio ambiente.
    • Sistema de archivos (Ejemplo:Si un guionista descontento decidiera eliminar archivos)
    • Base de datos (lo mismo elimina los registros de la base de datos)

Básicamente, necesito configurar el alcance de JavaScript para incluir solo exactamente lo que necesitan y nada más.

¿Fue útil?

Solución

Para protegerse contra bucles infinitos, necesitaría ponerlo en un proceso separado para poder eliminarlo.

Para protegerse contra la creación de subprocesos, deberá ampliar SecurityManager (la implementación predeterminada permite que código que no es de confianza acceda a grupos de subprocesos que no sean raíz).

La seguridad de Java le permite impedir el acceso al sistema de archivos.

Para las restricciones de la base de datos, es posible que pueda utilizar la seguridad de usuario SQL estándar, pero es bastante débil.De lo contrario, deberá proporcionar una API que haga cumplir sus restricciones.

Editar:Debo señalar que a la versión de Rhino proporcionada con JDK6 se le han realizado trabajos de seguridad, pero no incluye el compilador.

Otros consejos

Para protegerse contra bucles infinitos, puede observar el recuento de instrucciones a medida que se ejecuta el script (esto funciona sólo con scripts interpretados, no con los compilados).

hay esto ejemplo en Rhino JavaDocs Para evitar que un script se ejecute durante más de diez segundos:

 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();
     }
 }

Para bloquear el acceso a clases y métodos de Java, eche un vistazo a...

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

Acabo de encontrar esta publicación de blog que parece ser útil para hacer sandboxing de más o menos cualquier cosa (no solo Rhino):

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

Si busca únicamente funciones de JavaScript puras, aquí tiene una solución basada en la biblioteca JDK integrada de Rhino sin importar bibliotecas de terceros:

  1. Descubra el nombre de la clase de fábrica del motor de secuencias de comandos JavaScript mediante ScriptEngineManager#getEngineFactories
  2. Cargue la clase de fábrica del motor de script en un nuevo cargador de clases, en el que se ignorarán los JavaMembers u otras clases relacionadas.
  3. Llame a #getScriptEngine en la fábrica del motor de script cargado y eval scripts en el motor de script devuelto.

Si el script dado contiene un script Java, el cargador de clases intentará cargar JavaMembers u otras clases y activará excepciones de clase no encontrada.De esta forma, los scripts maliciosos se ignorarán sin ejecutarse.

Lea los archivos ConfigJSParser.java y ConfigJSClassLoader.java para obtener más detalles:

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

Javascript tiene un solo subproceso y no puede acceder al sistema de archivos, por lo que no creo que tengas que preocuparte por eso.No estoy seguro de si hay una manera de establecer un tiempo de espera para protegerse contra bucles infinitos, pero siempre puedes generar un hilo (Java) que ejecute el script y luego cerrar el hilo después de tanto tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top