side scripts script diferencias javascript security javax.script server-side-scripting

javascript - diferencias - ¿Cómo aseguro que los scripts se ejecuten utilizando javax.scripting?



server side script roblox (3)

Para su información, esto ahora es posible en la nueva implementación de Java 8 de javax.scripting, que utiliza un nuevo motor llamado Nashorn. Ver la ejecución segura de Nashorn JS

Estoy usando javax.scripting para agregar soporte para ejecutar JavaScripts subidos por usuarios arbitrarios en el lado del servidor. ¡Obviamente quiero asegurar esos scripts!

Rhino, por sí solo, tiene un marco para asegurar los scripts en tiempo de ejecución. La documentación para javax.scripting , sin embargo, no menciona la seguridad, los permisos o las clases de restricción disponibles para el script. Entonces, ¿esto es solo un gran agujero en la API javax.scripting que no ofrece un marco para asegurar los scripts que ejecuta?

No quiero usar Rhino directamente porque originalmente lo intenté, pero tuve algunos problemas para exponer las instancias de Java al script en ejecución. El marco javax.scripting hizo (que usa Rhino bajo el capó) lo hizo trivial y también simplificó la ejecución de scripts en un servidor de múltiples subprocesos.

Me gustaría incluir en una lista blanca las clases de Java a las que se puede acceder / crear instancias dentro del script en ejecución. ¿Alguien puede indicarme un ejemplo o documentación sobre cómo lograr esto?


Resulta que javax.scripting no ofrece un marco de seguridad. Después de algunas búsquedas, encontré un documento en el caché de Google que sugería tratar de usar el marco de doPrivilegedAction de Java para actividades doPrivilegedAction pero después de algunos experimentos, no pude obtener esto para evitar que los scripts abran sockets o accedan al sistema de archivos.

Después de hacer esta pregunta, descubrí que se había preguntado anteriormente aquí en : ¿Cómo se puede ejecutar Javascript utilizando Rhino para Java en un entorno limitado? En esa página, indica falsamente que el Rhino incluido en el JDK6 ya ha funcionado. Como indiqué, pude abrir sockets y otras acciones dañinas desde el script.

Al final, javax.scripting e javax.scripting Rhino directamente. Al crear un ContextFactory personalizado que también es un ClassShutter pude lograr dos resultados fácilmente:

  1. Restringe el tiempo de ejecución del script a un límite de tiempo máximo
  2. Restringe el acceso de clase a aquellos que tengo en la lista blanca, que básicamente es java.lang.* Y algunas clases selectas en la jerarquía de mi servidor.

CodeUtopia (al que no puedo enlazar porque, como nuevo usuario, no se me permite enlazar a varias páginas en una sola publicación; pero está vinculado en la otra publicación de ) fue valioso para describir la arquitectura de ClassShutter y la de Rhino. ContextFactory página de la API de ContextFactory describe cómo construir una ContextFactory personalizada.


http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ describe una forma de sandbox rhino, y javax.scripting usa Rhino como el motor de script JS, por lo que debería poder usar el arriba, aunque los nombres de los paquetes pueden diferir.

He estado trabajando en una aplicación Java que necesitaba Rhino para las secuencias de comandos. La aplicación tendría que ejecutar código JavaScript no confiable de terceros, así que tuve que encontrar una manera de bloquear el acceso a todos los métodos Java, excepto a los que quería. Esto no sería un problema si hubiera una manera fácil de deshabilitar LiveConnect, la característica de Rhino que proporciona acceso java a los scripts, pero no existe tal cosa.

Sin embargo, después de mucho escarbar, finalmente encontré una manera de hacerlo sin demasiada piratería. De hecho, se puede hacer simplemente extendiendo algunas de las clases de Rhino y utilizando los configuradores proporcionados para anular algunas de las predeterminadas.