Ветка: 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
в версию браузера с функциями, связанными с браузером.Несколько хитрое решение может включать в себя переписывание 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 даже не запускается. Если эта опция включена, я могу получить доступ к окну верхнего уровня. Но я не сдамся :)
Какую ошибку это вам выдало? Требовался ли доступ к переменной? Не хватало библиотеки? Любые данные, которые можно получить, обмениваясь сообщениями между фреймами?
Я попытался исправить доступ к окну тем же трюком, что и 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;
.
Самый полезный комментарий
Я думаю об использовании веб-воркеров, чтобы заставить vm2 работать в браузерах. Я попробую.