Vm2: Suporte para executar vm2 no navegador

Criado em 31 jul. 2017  ·  15Comentários  ·  Fonte: patriksimek/vm2

Filial: 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>

questões

  • Sandbox pode ser escapado por meio de window.top .

PENDÊNCIA

  • Remova NodeVM da versão do navegador.
  • Adicione BrowserVM à versão do navegador com recursos relacionados ao navegador.
  • Testes de navegador automatizados.
feature request help wanted

Comentários muito úteis

Estou pensando em usar web workers para fazer o vm2 funcionar em navegadores. Vou tentar.

Todos 15 comentários

Uma solução um tanto hacky poderia envolver a reescrita de AST para encapsular manualmente cada acesso de propriedade. Por exemplo, let x = foo.bar seria reescrito para let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar) .

Aqui está um exemplo de reescrita de AST, onde os nós de chamada de função são agrupados em nós como este .

As desvantagens dessa abordagem são que você não pode depurar facilmente o código reescrito e que são necessárias algumas soluções alternativas para lidar com Function, eval e similares.

Acho que a única maneira muito pesada é basicamente interpretar JS você mesmo ou substituir as construções de Functions por uma implementação customizada (como injetar variável e analisar conteúdo). Esse método seria muito difícil de implementar.

A exclusão de variáveis ​​é impossível devido a variáveis ​​como document e top que não podem ser excluídas nem substituídas.

@ io4 , substituir Function, eval e similares em tempo de execução é certamente possível com a reescrita de AST e também não é terrivelmente difícil. No entanto, ele incorre em um grande impacto no desempenho, tanto no "tempo de compilação", já que você precisa reescrever literalmente cada chamada de função, quanto no tempo de execução, uma vez que as chamadas de função precisam passar por uma camada de indireção.

Este problema foi automaticamente marcado como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.

Por favor, não feche, este é um assunto relevante.

Estou pensando em usar web workers para fazer o vm2 funcionar em navegadores. Vou tentar.

Talvez você também possa colocá-lo em um iframe em sandbox. Dessa forma, se escapar, ainda estará restrito ao quadro e não poderá navegar no contexto de navegação de nível superior.

O status é que não podemos usar web workers porque eles não compartilham uma memória com o host. Eu estava testando o iframe em sandbox, mas também sem sucesso. Sem a opção allow-same-origin , vm2 nem mesmo inicia. Com essa opção ativada, posso acessar a janela de nível superior. Mas eu não vou desistir :)

Que tipo de erro isso deu a você? Ele precisa acessar uma variável? Estava faltando uma biblioteca? Quaisquer dados que possam ser recuperados pela troca de mensagens entre iframes?

227 é de interesse, especialmente porque Realms foi mencionado especificamente para sandbox de navegador.

Eu tentei consertar o acesso à janela com o mesmo truque que o realms-shim faz.
Uma implementação pode ser encontrada aqui: https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
A desvantagem é que tudo na VM é executado no modo estrito.

@patriksimek para contornar o problema window.top , você não poderia observar o objeto e matar o script (lançamento e erro) se modificado / usado? Portanto, observe as propriedades e as funções de agrupamento

Filial: 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>

questões

  • Sandbox pode ser escapado por meio de window.top .

PENDÊNCIA

  • Remova NodeVM da versão do navegador.
  • Adicione BrowserVM à versão do navegador com recursos relacionados ao navegador.
  • Testes de navegador automatizados.

Não conheço uma maneira de observar window ou window.top de uma forma que permita lançar antes que algo aconteça.

Oi
Preciso importar vm2.js como um módulo para o arquivo de
Alguém pode ajudar por favor? Obrigada

Oi
Preciso importar vm2.js como um módulo para o arquivo de
Alguém pode ajudar por favor? Obrigada

Trabalhando como um módulo: adicionado module.exports = vm2; no final do arquivo.

Esta página foi útil?
0 / 5 - 0 avaliações