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.
Respuestas:
Java contiene intérprete de JavaScript incorporado. No está de forma predeterminada en el espacio aislado, pero esto se puede habilitar mediante:
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.
fuente
window
variables para JavaScript para permitir la interacción.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
fuente