¿Cuáles son mis opciones para las secuencias de comandos de espacio aislado del servidor? [cerrado]

11

Estoy creando un sitio web público donde los usuarios comparten datos y scripts para ejecutar algunos datos. Los scripts se ejecutan en el servidor en algún tipo de sandbox sin otra interacción este ciclo: mi programa Perl lee de una base de datos un script creado por el usuario, agrega los datos que se procesarán en el script (es decir, un documento JSON) y luego llama al intérprete. devuelve la respuesta (un documento JSON o texto sin formato), lo guardo en la base de datos con mi script perl. El script debería poder tener acceso a las funciones integradas agregadas al lenguaje de script por mí mismo, pero nada más.

Así que me topé con node.js como intérprete de JavaScript, y hace aproximadamente una hora con el V8 de Google (¿tiene sentido v8 para este tipo de cosas?). También me vino a la mente CoffeeScript, ya que se ve bien y sigue siendo Javascript.

Creo que javascript está lo suficientemente extendido y es más "sandboxeable" ya que no tiene llamadas al sistema operativo ni nada remotamente inseguro (creo).

Por cierto, estoy escribiendo el sistema en Perl y Php para el front-end.

Para mejorar la pregunta: estoy eligiendo Javascript porque creo que es lo suficientemente seguro y simple de implementar con node.js, pero ¿qué otras alternativas hay para lograr este tipo de tarea? Lua? ¿Pitón? Simplemente no puedo encontrar información sobre cómo ejecutar un intérprete de espacio aislado de manera adecuada.

alfa64
fuente
No está claro lo que estás preguntando. ¿Es posible? Claro que es posible.
Robert Harvey

Respuestas:

3

Java contiene intérprete de JavaScript incorporado. No está de forma predeterminada en el espacio aislado, pero esto se puede habilitar mediante:

  • establecer el obturador de clase correcto: JavaScript normalmente puede cargar clases de Java. El obturador de clase es un tipo de administrador de seguridad que decide qué clases se pueden cargar y cuáles no.
  • Script de "inicio": breve inicialización de JavaScript que elimina los puntos de acceso al sistema externo: java = undefined;Packages = undefined;org = undefined;

Si hace esto, los scripts que se ejecutan dentro no deberían poder acceder al entorno externo de ninguna manera.

También proporciona un tiempo de espera de script y una funcionalidad de limitación de recuento de instrucciones que es útil para el sandboxing: puede limitar la duración o la complejidad del script.

Utilicé esto en Java 7 que tiene el motor Rhino JavaScript. Java 8 tiene un motor Nashorn más nuevo y moderno: no lo probé con Nashorn, pero espero que sea similar.

qbd
fuente
¿Se puede incluir en la lista blanca en lugar de la lista negra?
Petah
@Petah, primero puede deshabilitar (lista negra) todo y luego insertar algunas funciones específicas en forma de objeto en el sandbox. Esto es esencialmente una lista blanca, así que sí, puedes hacerlo.
qbd
El conocimiento de JavaScript está lo suficientemente extendido como para que sea una buena opción como lenguaje de script. Es posible que desee definir algunas llamadas globales y llamadas para los usuarios, ya que está restringiendo el acceso a las llamadas. Piense en cómo el navegador define windowvariables para JavaScript para permitir la interacción.
Michael Shops en
2

mi primer pensamiento fue node.js: como mencionaste anteriormente, es un intérprete de JavaScript. Y eso es exactamente lo que necesita, si desea proteger los scripts de una manera realmente segura.

Otra forma podría ser, que verifique cada comando en un script, si es válido o no. Pero no creo que consigas una caja de arena segura.

Saludos

Tobi
fuente
¿Hay algún soporte de sandboxing en NodeJS o disponible con NodeJS?
ysdx
44
Encontré esto: gf3.github.com/sandbox
ysdx
+1 por el excelente enlace a "NIFTY JAVASCRIPT SANDBOX FOR NODE.JS".
Jack Stone
Nota: la caja de arena gf3 se puede romper.
Petah