Vm2: Soporte para ejecutar vm2 en el navegador

Creado en 31 jul. 2017  ·  15Comentarios  ·  Fuente: patriksimek/vm2

Rama: https://github.com/patriksimek/vm2/tree/feature-browsers
Biblioteca: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

Uso

<script src="vm2.js"></script>
<script>
    const vm = new vm2.VM();
    alert(vm.run('Math.random()'));
</script>

Asuntos

  • Se puede escapar de la zona de pruebas a través de window.top .

QUE HACER

  • Elimina NodeVM de la versión del navegador.
  • Agregue BrowserVM a la versión del navegador con funciones relacionadas con el navegador.
  • Pruebas de navegador automatizadas.
feature request help wanted

Comentario más útil

Estoy pensando en utilizar trabajadores web para que vm2 funcione en los navegadores. Lo intentaré.

Todos 15 comentarios

Una solución algo hacky podría implicar la reescritura de AST para envolver manualmente cada acceso a la propiedad. Por ejemplo, let x = foo.bar se reescribiría a let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar) .

A continuación, se muestra un ejemplo de reescritura de AST, donde los nodos de llamada de función se envuelven en nodos como este .

Las desventajas de este enfoque son que no se puede depurar fácilmente el código reescrito y que se necesitan algunas soluciones para lidiar con Function, eval y similares.

Creo que la única forma es muy pesada, es básicamente interpretar JS usted mismo o reemplazar las construcciones de Functions con una implementación personalizada (como inyectar variable y analizar contenido). Este método sería muy difícil de implementar.

La eliminación de variables es imposible debido a variables como document y top que no se pueden eliminar ni sobrescribir.

@ io4 , reemplazar Function, eval y similares en tiempo de ejecución es ciertamente posible con la reescritura de AST y tampoco es terriblemente difícil. Sin embargo, incurre en un gran impacto en el rendimiento, tanto en el "tiempo de compilación", ya que tiene que reescribir literalmente cada llamada de función y en tiempo de ejecución, ya que las llamadas de función tienen que pasar por una capa de indirección.

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

No cierre, este es un problema relevante.

Estoy pensando en utilizar trabajadores web para que vm2 funcione en los navegadores. Lo intentaré.

Tal vez también puedas ponerlo dentro de un iframe de espacio aislado. De esa manera, si se escapa, todavía está restringido al marco y no puede navegar por el contexto de navegación de nivel superior.

El estado es que no podemos usar trabajadores web porque no comparten una memoria con el host. Estaba probando el iframe en la zona de pruebas, pero tampoco tuve éxito. Sin la opción allow-same-origin , vm2 ni siquiera se inicia. Con esa opción habilitada, puedo acceder a la ventana de nivel superior. Pero no me rindo :)

¿Qué tipo de error te dio? ¿Necesitaba acceder a una variable? ¿Faltaba una biblioteca? ¿Algún dato que pueda recuperarse intercambiando mensajes entre iframes?

227 es de interés, especialmente porque Realms se mencionó específicamente para el sandboxing del navegador.

Intenté arreglar el acceso a la ventana con el mismo truco que hace realms-shim.
Se puede encontrar una implementación aquí: https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
La desventaja es que todo en la máquina virtual se ejecuta en modo estricto.

@patriksimek para window.top , ¿no podría observar el objeto y eliminar el script (lanzamiento y error) si se modifica / usa? Por lo tanto, observe las propiedades y las funciones de ajuste.

Rama: https://github.com/patriksimek/vm2/tree/feature-browsers
Biblioteca: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

Uso

<script src="vm2.js"></script>
<script>
    const vm = new vm2.VM();
    alert(vm.run('Math.random()'));
</script>

Asuntos

  • Se puede escapar de la zona de pruebas a través de window.top .

QUE HACER

  • Elimina NodeVM de la versión del navegador.
  • Agregue BrowserVM a la versión del navegador con funciones relacionadas con el navegador.
  • Pruebas de navegador automatizadas.

No conozco una forma de observar window o window.top de una manera que permita lanzar antes de que suceda algo.

Hola
Necesito importar vm2.js como un módulo en un archivo mecanografiado.
¿Puede ayudarme alguien, por favor? Gracias

Hola
Necesito importar vm2.js como un módulo en un archivo mecanografiado.
¿Puede ayudarme alguien, por favor? Gracias

Trabajando como un módulo: agregó module.exports = vm2; al final del archivo.

¿Fue útil esta página
0 / 5 - 0 calificaciones