javascript node.js eval sandbox sanitize

Safely sandbox y ejecutar el usuario enviado JavaScript?



node.js eval (4)

En Node.js puede crear un proceso secundario de espacio aislado, pero también debe agregar el código con "use strict"; , de lo contrario, es posible romper el sandbox con arguments.callee.caller .

No estoy seguro de por qué necesita enviarlo al servidor, porque el código también se puede ejecutar en un trabajador web con espacio aislado.

También eche un vistazo a mi biblioteca Jailed que simplifica todo lo que se acaba de mencionar tanto para Node.js como para el navegador web, y además brinda la oportunidad de exportar un conjunto de funciones al sandbox.

Me gustaría tener la capacidad de permitir a los usuarios enviar código JavaScript arbitrario, que luego se envía a un servidor Node.JS y se ejecuta de manera segura antes de que la salida se envíe a múltiples clientes (como JSON). La función eval viene a la mente, pero sé que esto tiene múltiples preocupaciones de seguridad (el código enviado por el usuario podría acceder a File API de Node, etc.). He visto algunos proyectos como Microsoft Web Sandbox y Google Caja que permiten la ejecución de etiquetas y scripts desinfectados (para incrustar anuncios de terceros en sitios web), pero parece que estas son herramientas del lado del cliente y no estoy seguro si pueden ser utilizado con seguridad dentro del nodo.

¿Existe una forma estándar de sandbox y ejecutar JavaScript no confiable en Node, obteniendo el resultado? ¿Es un error intentar hacer esto en el servidor?

EDITAR: no es importante que el usuario pueda aprovechar todas las capacidades de JavaScript; de hecho, sería preferible elegir las API que se proporcionarían al código de usuario.

EDITAR: Voy a continuar y actualizar con lo que encontré. Este módulo de Sandcastle ( bcoe/sandcastle ) parece apuntar a hacer lo que tengo en mente. No estoy seguro de qué tan seguro es, pero como esto no es para nada demasiado importante, creo que lo haré si lo intento. Agregaré mi propia respuesta si puedo hacer esto con éxito.


Esta respuesta está desactualizada ya que gf3 no brinda protección contra la ruptura de sandbox

http://gf3.github.io/sandbox/ - usa require(''child_process'') lugar de require(''vm'') .


Puede usar el soporte de espacio aislado en nodejs con vm.runInContext (''código js'', contexto), muestra en la documentación de API:

https://nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_options

const util = require(''util''); const vm = require(''vm''); const sandbox = { globalVar: 1 }; vm.createContext(sandbox); for (var i = 0; i < 10; ++i) { vm.runInContext(''globalVar *= 2;'', sandbox); } console.log(util.inspect(sandbox)); // { globalVar: 1024 }

ADVERTENCIA: Como lo señala "s4y", parece estar dañado. Por favor mira los comentarios.


Una alternativa sería usar http://github.com/patriksimek/vm2 :

$ npm install vm2

entonces:

const {VM} = require(''vm2''); const vm = new VM(); vm.run(`1 + 1`); // => 2

como se menciona en los comentarios de otras respuestas.

No sé qué tan seguro es, pero al menos afirma que ejecuta el código no confiable de forma segura (en su archivo README). Y no pude encontrar ningún problema de seguridad obvio en lo que respecta a las soluciones sugeridas en otras respuestas aquí.