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
window.top
.QUE HACER
NodeVM
de la versión del navegador.BrowserVM
a la versión del navegador con funciones relacionadas con el navegador.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?
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.jsUso
<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.
Comentario más útil
Estoy pensando en utilizar trabajadores web para que vm2 funcione en los navegadores. Lo intentaré.