He investigado y existen algunas formas sólidas para el usuario de sandbox JS, a saber:
- Use una máquina virtual JS que ejecute JS utilizando una forma de espacio aislado de js, como VM.js
- Use un transpiler como Google Caja, que agrega controles adicionales para preservar ciertos invariantes y no permite rutas de código específicas
- Use un dominio cruzado (y / o
sandbox
ed)iframe
, posiblemente también con un trabajador web, por ejemplo. Encarcelado
Lamentablemente, ninguno de estos funciona bien de forma inmediata para mi aplicación. Estoy tratando de construir una alternativa jsperf.com (es decir, un sistema de evaluación comparativa JS basado en la web), por lo que las dos primeras están fuera, ya que afectarían el rendimiento del código proporcionado por el usuario, lo que invalida completamente los resultados de la evaluación comparativa.
Jailed está más cerca, pero tampoco es una gran alternativa porque A) su enfoque de lista blanca es tan restrictivo que mi sitio no podría probar el rendimiento de muchas características de la web (operaciones DOM, IndexedDb, WebWorkers , LocalStorage, etc.) sin una gran cantidad de listas blancas que ni siquiera estoy seguro de que funcionaría y B) no estoy seguro de qué tan bien mantenido (y por lo tanto seguro) se da cuánta actividad hay en su repositorio de GitHub.
¿Cuál es el sistema más permisivo (en términos de cercanía a la ejecución de aplicaciones sin caja) que puedo usar de manera segura para ejecutar el JS proporcionado por el usuario para la evaluación comparativa? ¿Es suficiente un iframe
en espacio aislado para que los puntos de referencia puedan acceder al menos a algunos DOM y otras API web? ¿Es realmente necesario el trabajador web? ¿Qué hacen jsfiddle y similares?