Vm2: Поддержка запуска vm2 в браузере

Созданный на 31 июл. 2017  ·  15Комментарии  ·  Источник: patriksimek/vm2

Ветка: https://github.com/patriksimek/vm2/tree/feature-browsers
Библиотека: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

Применение

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

вопросы

  • Из песочницы можно выйти с помощью window.top .

ДЕЛАТЬ

  • Удалите NodeVM из версии браузера.
  • Добавьте BrowserVM в версию браузера с функциями, связанными с браузером.
  • Автоматизированные браузерные тесты.
feature request help wanted

Самый полезный комментарий

Я думаю об использовании веб-воркеров, чтобы заставить vm2 работать в браузерах. Я попробую.

Все 15 Комментарий

Несколько хитрое решение может включать в себя переписывание AST, чтобы вручную обернуть каждый доступ к свойству. Например, let x = foo.bar будет заменено на let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar) .

Вот пример переписывания AST, где узлы вызова функций обернуты в узлы, подобные этому .

Недостатки этого подхода заключаются в том, что вы не можете легко отладить переписанный код и что для работы с Function, eval и т.п. требуются некоторые обходные пути.

Я думаю, что единственный способ очень тяжелый, это в основном интерпретировать JS самостоятельно или заменять конструкции функций пользовательской реализацией (например, вводить переменную и анализировать содержимое). Этот метод было бы очень сложно реализовать.

Удаление переменной невозможно из-за таких переменных, как document и top которые нельзя удалить или перезаписать.

@ io4 , замена Function, eval и т.п. во время выполнения, безусловно, возможна с переписыванием AST, и это тоже не так уж сложно. Однако это сильно снижает производительность как во «время компиляции», поскольку вам приходится переписывать буквально каждый вызов функции, так и во время выполнения, поскольку вызовы функций должны проходить через один уровень косвенности.

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.

Пожалуйста, не закрывайте, это актуальная проблема.

Я думаю об использовании веб-воркеров, чтобы заставить vm2 работать в браузерах. Я попробую.

Возможно, вы также можете поместить его в песочницу iframe. Таким образом, если он ускользает, он по-прежнему ограничен рамкой и не может перемещаться по контексту просмотра верхнего уровня.

Статус таков, что мы не можем использовать веб-воркеров, потому что они не разделяют память с хостом. Я тестировал iframe в песочнице, но безуспешно. Без опции allow-same-origin vm2 даже не запускается. Если эта опция включена, я могу получить доступ к окну верхнего уровня. Но я не сдамся :)

Какую ошибку это вам выдало? Требовался ли доступ к переменной? Не хватало библиотеки? Любые данные, которые можно получить, обмениваясь сообщениями между фреймами?

227 представляет интерес, тем более что Realms упоминается специально для песочницы браузера.

Я попытался исправить доступ к окну тем же трюком, что и realms-shim.
Реализацию можно найти здесь: https://github.com/XmiliaH/vm2/blob/feature-browsers/lib/vm.js
Недостатком является то, что все в виртуальной машине работает в строгом режиме.

@patriksimek, чтобы обойти window.top , не могли бы вы не наблюдать за объектом и не убить сценарий (выброс и ошибка), если он был изменен / использован? Итак, обратите внимание на свойства и функции обертывания

Ветка: https://github.com/patriksimek/vm2/tree/feature-browsers
Библиотека: https://github.com/patriksimek/vm2/blob/feature-browsers/dist/vm2.js

Применение

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

вопросы

  • Из песочницы можно выйти с помощью window.top .

ДЕЛАТЬ

  • Удалите NodeVM из версии браузера.
  • Добавьте BrowserVM в версию браузера с функциями, связанными с браузером.
  • Автоматизированные браузерные тесты.

Я не знаю способа наблюдать window или window.top таким образом, чтобы это позволяло бросать до того, как что-то произойдет.

Привет
Мне нужно импортировать vm2.js как модуль в файл машинописного
Может кто-нибудь помочь? Спасибо

Привет
Мне нужно импортировать vm2.js как модуль в файл машинописного
Может кто-нибудь помочь? Спасибо

Работает как модуль: в конец файла добавлен module.exports = vm2; .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги