Vm2: 支持在浏览器中运行vm2

创建于 2017-07-31  ·  15评论  ·  资料来源: patriksimek/vm2

分支: https :
图书馆: https

用法

<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

最有用的评论

我正在考虑使用Web Worker使vm2在浏览器中工作。 我会试一试。

所有15条评论

有点怪异的解决方案可能涉及AST重写,以手动包装每个属性访问。 例如, let x = foo.bar将被重写为let x = (x => (x == window.top) ? (some patch here) : x)(foo.bar)

这里是重写AST,其中的函数调用节点被包裹在像节点的一例

这种方法的缺点是您无法轻松调试重写的代码,并且需要一些变通办法来处理Function,eval等。

我认为唯一的方法是非常重量级的,它是您自己基本上解释JS或用自定义实现(例如注入变量和解析内容)替换Functions构造。 这种方法将很难实施。

由于变量documenttop无法删除或覆盖,因此无法删除变量。

@ io4 ,使用AST重写当然可以在运行时替换Function,eval等,这也不是很困难的。 但是,由于在“编译时”确实要重写每个函数调用,而在运行时则要重写函数,因为函数调用必须经过一层间接,这确实会严重打击性能。

由于此问题最近没有活动,因此已被自动标记为陈旧。 如果没有其他活动发生,它将关闭。 感谢你的贡献。

请不要关闭,这是一个相关的问题。

我正在考虑使用Web Worker使vm2在浏览器中工作。 我会试一试。

也许您也可以将其放入沙盒iframe中。 这样,即使它逃脱了,它仍然仅限于框架并且无法导航顶级浏览上下文。

状态是我们不能使用网络工作者,因为他们不与主机共享内存。 我正在测试沙盒iframe,但那里也没有成功。 如果没有allow-same-origin选项,vm2甚至无法启动。 启用该选项后,我可以访问顶级窗口。 但我没有放弃:)

它给你什么样的错误? 是否需要访问变量? 是否缺少图书馆? 通过在iframe之间交换消息可以检索到任何数据吗?

227很受关注,尤其是因为Realms是专门为浏览器沙盒提到的。

我确实尝试使用与realms-shim相同的技巧来修复对窗口的访问。
可以在这里找到一个实现: https :
缺点是虚拟机中的所有内容均以严格模式运行。

@patriksimek解决window.top问题,如果修改/使用过,您能观察不到对象并杀死脚本(抛出错误)吗? 因此,观察属性并包装函数

分支: https :
图书馆: https

用法

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

问题

  • 沙箱可以通过window.top进行转义。

去做

  • 从浏览器版本中删除NodeVM
  • BrowserVM到具有浏览器相关功能的浏览器版本。
  • 自动化的浏览器测试。

我不知道一种观察windowwindow.top的方法,该方法可以在发生某些事情之前抛出。

你好
我需要将vm2.js作为模块导入
有人可以帮忙吗? 谢谢

你好
我需要将vm2.js作为模块导入
有人可以帮忙吗? 谢谢

作为模块工作:在文件末尾添加module.exports = vm2;

此页面是否有帮助?
0 / 5 - 0 等级