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
window.top
.PENDÊNCIA
NodeVM
da versão do navegador.BrowserVM
à versão do navegador com recursos relacionados ao navegador.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?
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.jsUso
<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.
Comentários muito úteis
Estou pensando em usar web workers para fazer o vm2 funcionar em navegadores. Vou tentar.